spark jdbc操作

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark jdbc操作相关的知识,希望对你有一定的参考价值。

按条件读表

如果要按条件读表,按官网的解释可以用query参数,官网也说dbtable和query参数不能同时使用,但是我测试发现只用query会报错,说没有dbtable参数。
requirement failed: Option ‘dbtable’ is required

可以用dbtable参数查询,注意写法,要加一个表的别名。

jdbcDF = spark.read
 .format("jdbc")
 .option("url", "jdbc:mysql://172.17.1.80:3306?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true")
 .option("dbtable", "(select id from dbtest.test ) tmp")
 .option("user", "root")
 .option("password", "123456")
 .load()

全量和增量写表

下面是把df2这个dataframe写入到mysql中,df2的schema的字段名要和mysql中的字段名一致。

 df2.write
    .format("jdbc")
    .mode(SaveMode.Overwrite)
    .option("url", this.url + "&rewriteBatchedStatements=true")
    .option("dbtable", this.database + "." + this.table)
    .option("truncate",true)
    .option("batchSize", bSize)
    .option("user", this.user)
    .option("password", this.password)
    .save()

SaveMode有四个模式,默认是ErrorIfExists

SaveMode
ErrorIfExists如果数据库中已经存在该表,则会直接报异常,导致数据不能存入数据库
Append如果数据库中表已经存在,则追加在该表中;若该表不存在,则会先创建表,再插入数据
Overwrite先将已有的表及其数据全都删除,再重新创建该表,最后插入新的数据;
Ignore若表不存在,则创建表,并存入数据;在表存在的情况下,直接跳过数据的存储,不会报错

注意Overwrite 是先删表再建表,如果不想删表,而是要清空表的数据再插入新的数据需要设置.option(“truncate”,true)

以上是关于spark jdbc操作的主要内容,如果未能解决你的问题,请参考以下文章

spark jdbc操作

spark之JDBC开发(连接数据库测试)

Spark操作外部数据源--MySQL

Spark SQL为JDBC查询生成错误的上限和下限

如何计算 Spark SQL(Databricks)中表中的列数?

spark操作hive方式(scala)