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 并不会去过滤数据

posted @ 2018-11-07 15:36  生心无住  阅读(2423)  评论(0编辑  收藏  举报