mysql - Spark DataFrame InsertIntoJDBC - TableAlreadyExists 异常

标签 mysql apache-spark spark-dataframe singlestore

使用 Spark 1.4.0,我尝试使用 insertIntoJdbc() 将数据从 Spark DataFrame 插入到 MemSQL 数据库中(这应该与与 MySQL 数据库交互完全一样)。但是,我不断收到运行时 TableAlreadyExists 异常。

首先,我像这样创建 MemSQL 表:

CREATE TABLE IF NOT EXISTS table1 (id INT AUTO_INCREMENT PRIMARY KEY, val INT);

然后我在 Spark 中创建一个简单的数据框并尝试像这样插入到 MemSQL 中:

val df = sc.parallelize(Array(123,234)).toDF.toDF("val")
//df: org.apache.spark.sql.DataFrame = [val: int]

df.insertIntoJDBC("jdbc:mysql://172.17.01:3306/test?user=root", "table1", false)

java.lang.RuntimeException: Table table1 already exists.

最佳答案

此解决方案适用于一般 JDBC 连接,尽管@wayne 的回答可能是专门针对 memSQL 的更好解决方案。

从 1.4.0 开始,insertIntoJdbc 似乎已被弃用,使用它实际上会调用 write.jdbc()。

write() 返回一个 DataFrameWriter 对象。如果您想将数据追加到您的表中,您必须将对象的保存模式更改为 "append"

上述问题示例的另一个问题是 DataFrame 架构与目标表的架构不匹配。

下面的代码给出了一个来自 Spark shell 的工作示例。我正在使用 spark-shell --driver-class-path mysql-connector-java-5.1.36-bin.jar 来启动我的 spark-shell session 。

import java.util.Properties

val prop = new Properties() 
prop.put("user", "root")
prop.put("password", "")  

val df = sc.parallelize(Array((1,234), (2,1233))).toDF.toDF("id", "val")   
val dfWriter = df.write.mode("append") 

dfWriter.jdbc("jdbc:mysql://172.17.01:3306/test", "table1", prop) 

关于mysql - Spark DataFrame InsertIntoJDBC - TableAlreadyExists 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915682/

相关文章:

MySQL TABLE.TABLE_ROWS 在插入期间减少

apache-spark - SparkContext.getOrCreate() 目的

r - sparklyr 中是否有等效的 cbind() 或 bind_cols()?

apache-spark - 如何在spark中加入2个已经用同一列分区的数据帧而不进行洗牌..?

scala - Spark Scala : retrieve the schema and store it

mysql - InnoDB 在测试环境中的性能

php - 从 php 运行时 SQL IN 不工作

php - php中的手机型号检测

scala - apache Spark 纱簇

scala - 如何在Oozie spark scala作业中将文件从本地复制到HDFS目录?