使用 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/