spark的dataframe写入mysql的坑

从Spark Shell连接到MySQL:
spark-shell --jars "/path/mysql-connector-java-5.1.42.jar

可以使用Data Sources API将来自远程数据库的表作为DataFrame或Spark SQL临时视图加载。用户可以在数据源选项中指定JDBC连接属性。

可以使用Data Sources API将来自远程数据库的表作为DataFrame或Spark SQL临时视图加载。用户可以在数据源选项中指定JDBC连接属性。 user并且password通常作为用于登录数据源的连接属性提供。除了连接属性外,Spark还支持以下不区分大小写的选项:

JDBC connection properties
属性名称和含义
url:要连接的JDBC URL。列如:jdbc:mysql://ip:3306
dbtable:应该读取的JDBC表。可以使用括号中的子查询代替完整表。
driver:用于连接到此URL的JDBC驱动程序的类名,列如:com.mysql.jdbc.Driver

partitionColumn, lowerBound, upperBound, numPartitions
这些options仅适用于read数据。这些options必须同时被指定。他们描述,如何从多个workers并行读取数据时,分割表。
partitionColumn:必须是表中的数字列。
lowerBound和upperBound仅用于决定分区的大小,而不是用于过滤表中的行。
表中的所有行将被分割并返回。

fetchsize:仅适用于read数据。JDBC提取大小,用于确定每次获取的行数。这可以帮助JDBC驱动程序调优性能,这些驱动程序默认具有较低的提取大小(例如,Oracle每次提取10行)。

batchsize:仅适用于write数据。JDBC批量大小,用于确定每次insert的行数。
这可以帮助JDBC驱动程序调优性能。默认为1000。

isolationLevel:仅适用于write数据。事务隔离级别,适用于当前连接。它可以是一个NONE,READ_COMMITTED,READ_UNCOMMITTED,REPEATABLE_READ,或SERIALIZABLE,对应于由JDBC的连接对象定义,缺省值为标准事务隔离级别READ_UNCOMMITTED。请参阅文档java.sql.Connection。

truncate:仅适用于write数据。当SaveMode.Overwrite启用时,此选项会truncate在MySQL中的表,而不是删除,再重建其现有的表。这可以更有效,并且防止表元数据(例如,索引)被去除。但是,在某些情况下,例如当新数据具有不同的模式时,它将无法工作。它默认为false。

createTableOptions:仅适用于write数据。此选项允许在创建表(例如CREATE TABLE t (name string) ENGINE=InnoDB.)时设置特定的数据库表和分区选项。

 

 

 

 

 

 

spark jdbc read MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

val jdbcDF11 = spark.read.format("jdbc")

      .option("driver""com.mysql.jdbc.Driver")

      .option("url""jdbc:mysql://ip:3306")

      .option("dbtable""db.user_test")

      .option("user""test")

      .option("password""123456")

      .option("fetchsize""3")

      .load()

jdbcDF11.show

 

val jdbcDF12 = spark.read.format("jdbc").options(

      Map(

        "driver" -> "com.mysql.jdbc.Driver",

        "url" -> "jdbc:mysql://ip:3306",

        "dbtable" -> "db.user_test",

        "user" -> "test",

        "password" -> "123456",

        "fetchsize" -> "3")).load()

jdbcDF12.show

 

 

 

 

df.write.mode("overwrite").format("jdbc").options(

  Map(

    "driver" -> "com.mysql.jdbc.Driver",

    "url" -> "jdbc:mysql://ip:3306",

    "dbtable" -> "db.affairs",

    "user" -> "test",

    "password" -> "123456",

    "batchsize" -> "1000",

    "truncate" -> "true")).save()

 

 

 

 

df.write.mode("overwrite")
  .format("jdbc")
  .option("url", HousekeeperConstants.SOURCE_MYSQL_URL)
  .option("dbtable", tablename) //表名
  .option("user", HousekeeperConstants.SOURCE_MYSQL_USERNAME)
  .option("password", HousekeeperConstants.SOURCE_MYSQL_PASSWORD)
  .option("batchsize", "50000")
  .option("truncate", "true")
  .save()

你可能感兴趣的:(大数据,Spark)