Spark将数据写入Mysql

前言

我在很早之前用spark读取本地文件然后使用如下代码将数据写入到mysql

df.write.format("jdbc")
      .mode(SaveMode.Append)
      .option("url", "jdbc:mysql://localhost:3306/spark")
      .option("dbtable", "unisk")
      .option("user", "root")
      .option("password", "root")
      .save()

现在需要打包后提交到集群,本以为依然可以使用这个代码提交,没想到…

几个问题

  • 需不需要给每个节点上传驱动

并不需要给每个节点上传,只需要给提交代码的节点上传即可

  • 提交spark需不需要加:–jars /var/lib/hadoop-hdfs/mysql-connector-java-5.1.32-bin.jar \

需要
不然报错:
Exception in thread “main” java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

  • 可不可以在代码中不加 .option(“driver”, “com.mysql.jdbc.Driver”)配置

不可以
不然报错:
Exception in thread “main” java.sql.SQLException: No suitable driver

  • 可不可以不在maven中配置驱动

不可以
不然报错:
Exception in thread “main” java.sql.SQLException: No suitable driver

  • maven中驱动版本需要和本地驱动版本一致吗

不需要

如何写提交到集群的入库代码

df.write.format(source = "jdbc")
        .mode(SaveMode.Append)
        .option("url", "jdbc:mysql://xxx.xx.x.xx:3306/app_als")
        .option("dbtable", s"ads_bsn_corr_di")
        .option("user", "root")
        .option("password", "root")
        .option("driver", "com.mysql.jdbc.Driver")
        .save()

dbtable表名可以不用预先在mysql创建
不过,字段类型就是默认的text和bigint了,如下:

+--------------+------------+------+-----+---------+-------+
| Field        | Type       | Null | Key | Default | Extra |
+--------------+------------+------+-----+---------+-------+
| prod_id      | text       | YES  |     | NULL    |       |
| statis_month | text       | YES  |     | NULL    |       |
| app_ctg      | text       | NO   |     | NULL    |       |
| ct_user      | bigint(20) | NO   |     | NULL    |       |
| s_flow       | bigint(20) | YES  |     | NULL    |       |
+--------------+------------+------+-----+---------+-------+

如何提交代码

spark-submit \
--class cn.unisk.mysql.Test\
--master yarn \
--deploy-mode  cluster \
--jars /var/lib/hadoop-hdfs/mysql-connector-java-5.1.32-bin.jar \
/path/Jar.jar 

上面提交主要是想显示出–jars参数,并没有其他详细的参数配置

读取配置文件的方式

比如我们一个代码中,有很多dataframe入库的需求,这个时候最好是把mysql的需要的配置信息写到一个配置文件中,这样方便后续维护,比如可以方便统一修改配置信息等

  1. 在resources目录下创建一个比如名叫mysql.properties的文件,写入:
url=jdbc:mysql://localhost:3306/test
dbtable=user
user=root
password=root
driver=com.mysql.jdbc.Driver
  1. 加载配置文件
val prop = new Properties()
prop.load(this.getClass.getClassLoader.getResourceAsStream("mysql.properties"))
val url = prop.getProperty("url")
val dbtable = prop.getProperty("dbtable")
val user = prop.getProperty("user")
val password = prop.getProperty("password")
val driver = prop.getProperty("driver")
  1. 使用配置信息
df.write.format(source = "jdbc")
        .mode(SaveMode.Append)
        .option("url", url)
        .option("dbtable", dbtable)
        .option("user", user)
        .option("password",password)
        .option("driver",driver)
        .save()

很显然,如果以后要修改配置信息,只要在配置文件中修改一次即可

后记

这种方式入mysql库非常方便,这里需要注意一个问题:如果mysql中有三个字段名字为id,name,age,那么spark入库的时候必须与mysql表结构的字段名称完全一致不然报错:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Column "x" not found in schema Some(StructType(StructField(id,IntegerType,true), StructField(name,StringType,true), StructField(age,IntegerType,true)));

我们完全可以指定某几个字段,入mysql库,这样也非常的方便咯.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值