spark 存取mysql
1.先上代码,存入mysql
val spark = SparkSession.builder() .appName("jdbc") .getOrCreate() import spark.implicits._ val pathcsv = "/user/xxx/private/moviecsv" val csvdf = spark.read.format("csv") .option("sep", ",") .option("inferSchema", "true") .option("header", "true") .load(pathcsv) csvdf.write .format("jdbc") .mode(SaveMode.Overwrite) .option("url", "jdbc:mysql://ip:port/database?useUnicode=true&characterEncoding=utf-8") .option("dbtable", "database.table") .option("user", "root") .option("password", "123456") .option("batchsize", "1000")
.option("createTableOptions", "engine=MyISAM")
.option("createTableColumnTypes", "Ratings varchar(200)")
.option("truncate", "true") .option("numPartitions", "20") .save() spark.stop()
参数解释
url: 连接mysql 的url
user:登陆mysql的用户
password :登陆密码
dbtable: 要访问的数据库 点 表
batchsize : 当条数达到batchsize时会往mysql插入一次数据
truncate : 当savemode是 overwrite时,若dataframe 与原mysql 结构相同,则只truncate mysql,不会重新建表
numPartions : 访问mysql的并发数,注意:当dataframe的分区数小于numPartitions 时,并发数是dataframe的分区数,否则并发数是numPartitions
createTableOptions:建表时的一些额外选项,比如指定engine, "engine=MyISAM",源码中是这样处理createTableOptions 的val sql = s"CREATE TABLE $table ($strSchema) $createTableOptions"
createTableColumnTypes:可以用来替换默认的字段类型,比如name 字段默认是text 类型,可以手动指定为 “name varchar(200)”
2.spark 读取mysql
val jdbccdf = spark.read.format("jdbc") .option("url", "jdbc:mysql://192.168.100.200:1234/data_store?useUnicode=true&characterEncoding=utf-8") .option("dbtable", "data_store.movieaa") .option("user", "root") .option("password", "12345") .option("fetchsize", "1000") .option("truncate", "true") .option("numPartitions", "6") .option("partitionColumn", "UserID") .option("lowerBound", "1000") .option("upperBound", "6000") .load()
dbtable除了1 中的写法还可以是一个 query :option("dbtable", "(select * from data_store.movieaa where userid between 1000 and 2000) as tt")
partitionColumn:分区列,只支持数值类型,当此参数存在时,lowerBound 和upperBound 必须存在,bound 和numpartition 起到了分区的作用,bound 并不会去过滤数据
欢迎转载,不必注明出处