Spark SQL将数据写入Mysql表的一些坑
2017-11-30 11:52
239 查看
最近,在使用Spark SQL分析一些数据,要求将分析之后的结果数据存入到相应的MySQL表中。
但是将数据处理完了之后,存入Mysql时,报错了:
代码的基本形式为:
[java] view
plain copy
val r1: Dataset[Row] = data.groupBy(***)...
r1.write.jdbc(url,"iptimecount",prop)
根据图片中的报错,搜索资料,得知是由于Spark SQL 中的Save Mode导致的,Spark
SQL的官方文档中对Savemode进行了说明:
默认情况下,使用SaveMode.ErrorIfExists,也就是说,当从Spark中插入到MySQL表中的时候,如果表已经存在,则直接报错,想想真觉得这默认值有点坑。
于是修改Savemode,将代码改成:
[java] view
plain copy
r1.write.mode(SaveMode.Append).jdbc(url,"iptimecount",prop)
再次执行,本以为应该会顺利存入到数据库中了,没想到还是报错:
看到这个错误,我有点茫然,不清楚是哪里的问题。
后来,在一次测试中,将MySQL中将原来的表格删除后,再次提交任务,能顺利将数据存入到MySQL中,但是,使用desc查看表的结构,发现在Spark SQL中列类型为String类型的,在MySQL中对应为Text类型,于是我猜测应该是我之前创建的表格中,将列的类型定义为char和varchar导致的。
于是,我删除表格,重新创建表格,将char和varchar类型改为Text,再次执行,顺利的将数据从Spark SQL中存入到了Mysql.
另附一些注意事项:
数据存入Mysql注意事项
A. 尽量先设置好存储模式
默认为SaveMode.ErrorIfExists模式,该模式下,如果数据库中已经存在该表,则会直接报异常,导致数据不能存入数据库.另外三种模式如下:
SaveMode.Append 如果表已经存在,则追加在该表中;若该表不存在,则会先创建表,再插入数据;
SaveMode.Overwrite 重写模式,其实质是先将已有的表及其数据全都删除,再重新创建该表,最后插入新的数据;
SaveMode.Ignore 若表不存在,则创建表,并存入数据;在表存在的情况下,直接跳过数据的存储,不会报错。
B. 设置存储模式的步骤为:
org.apache.spark.sql.SaveMode
......
df.write.mode(SaveMode.Append)
C. 若提前在数据库中手动创建表,需要注意列名称和数据类型,
下面的源码说明了,需要保证Spark SQL中schema中的field name与Mysql中的列名称一致!
若提前手动创建Mysql表,需要注意Spark SQL 中Schema中的数据类型与Mysql中的数据类型的对应关系,如下图所示:
特别注意: Scala中的String类型,在MySQL中对应的是Text类型(经过亲自测试所知)
上面是本人在Spark SQL 读取与写入Mysql方面的遇到的一些坑,特在此备忘。
但是将数据处理完了之后,存入Mysql时,报错了:
代码的基本形式为:
[java] view
plain copy
val r1: Dataset[Row] = data.groupBy(***)...
r1.write.jdbc(url,"iptimecount",prop)
根据图片中的报错,搜索资料,得知是由于Spark SQL 中的Save Mode导致的,Spark
SQL的官方文档中对Savemode进行了说明:
默认情况下,使用SaveMode.ErrorIfExists,也就是说,当从Spark中插入到MySQL表中的时候,如果表已经存在,则直接报错,想想真觉得这默认值有点坑。
于是修改Savemode,将代码改成:
[java] view
plain copy
r1.write.mode(SaveMode.Append).jdbc(url,"iptimecount",prop)
再次执行,本以为应该会顺利存入到数据库中了,没想到还是报错:
看到这个错误,我有点茫然,不清楚是哪里的问题。
后来,在一次测试中,将MySQL中将原来的表格删除后,再次提交任务,能顺利将数据存入到MySQL中,但是,使用desc查看表的结构,发现在Spark SQL中列类型为String类型的,在MySQL中对应为Text类型,于是我猜测应该是我之前创建的表格中,将列的类型定义为char和varchar导致的。
于是,我删除表格,重新创建表格,将char和varchar类型改为Text,再次执行,顺利的将数据从Spark SQL中存入到了Mysql.
另附一些注意事项:
数据存入Mysql注意事项
A. 尽量先设置好存储模式
默认为SaveMode.ErrorIfExists模式,该模式下,如果数据库中已经存在该表,则会直接报异常,导致数据不能存入数据库.另外三种模式如下:
SaveMode.Append 如果表已经存在,则追加在该表中;若该表不存在,则会先创建表,再插入数据;
SaveMode.Overwrite 重写模式,其实质是先将已有的表及其数据全都删除,再重新创建该表,最后插入新的数据;
SaveMode.Ignore 若表不存在,则创建表,并存入数据;在表存在的情况下,直接跳过数据的存储,不会报错。
B. 设置存储模式的步骤为:
org.apache.spark.sql.SaveMode
......
df.write.mode(SaveMode.Append)
C. 若提前在数据库中手动创建表,需要注意列名称和数据类型,
下面的源码说明了,需要保证Spark SQL中schema中的field name与Mysql中的列名称一致!
若提前手动创建Mysql表,需要注意Spark SQL 中Schema中的数据类型与Mysql中的数据类型的对应关系,如下图所示:
特别注意: Scala中的String类型,在MySQL中对应的是Text类型(经过亲自测试所知)
上面是本人在Spark SQL 读取与写入Mysql方面的遇到的一些坑,特在此备忘。
相关文章推荐
- Spark SQL将数据写入Mysql表的一些坑
- Spark SQL将数据写入Mysql表的一些坑
- Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)
- LOAD DATA INFILE语句导入数据进入MySQL的一些注意事项
- php 写入数据到MySQL以及从MySQL获取数据,页面出现乱码的解决方法
- spark sql 访问hive数据时找不mysql的解决方法
- MYSQL写入数据时报错ERROR 1366 (HY000): Incorrect string value: '\xE8\x8B\xB1\xE5\xAF\xB8...' for c 插入中文不能插入
- MYSQL从一个数据库的表中读出数据 循环向另外一个库的表中写入数据
- MySQL中一些常用的数据表操作语句笔记
- mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)
- java程序向mysql写入数据乱码问题
- mysql+C#实战一:向数据库里面写入数据
- Packet for query is too large(mysql写入数据过大)
- 走近SSH之Hibernate--Hibernate创建数据表并向表中写入数据(Hibernate+MySql)
- json 数据写入mysql 数据库的方法
- scala实战之spark源码修改(能够将DataFrame按字段增量写入mysql数据表)
- Mysql 1秒200笔GPS数据批量写入优化
- Spark写入数据到MySQL
- SparkSql将数据写入到MySQL
- SQL Server Migration Assistant for MySQL(SSMA),数据迁移后的一些善后操作