将转换后的DataFrame保存/导出回JDBC/MySQL

Mat*_*ski 7 apache-spark apache-spark-sql apache-spark-1.5

我正在试图弄清楚如何使用new DataFrameWriter将数据写回JDBC数据库.我似乎无法找到任何相关的文档,虽然查看源代码似乎应该是可能的.

我正在尝试的一个简单的例子看起来像这样:

sqlContext.read.format("jdbc").options(Map(
  "url" -> "jdbc:mysql://localhost/foo", "dbtable" -> "foo.bar")
).select("some_column", "another_column")
.write.format("jdbc").options(Map(
  "url" -> "jdbc:mysql://localhost/foo", "dbtable" -> "foo.bar2")
).save("foo.bar2")
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 我最终得到了这个错误:

java.lang.RuntimeException: org.apache.spark.sql.execution.datasources.jdbc.DefaultSource does not allow create table as select.
    at scala.sys.package$.error(package.scala:27)
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:200)
Run Code Online (Sandbox Code Playgroud)

我不确定我做错了什么(为什么它会解析为DefaultSource而不是JDBCRDD?)或者如果使用Spark的DataFrames API无法写入现有的MySQL数据库.

zer*_*323 8

更新

当前Spark版本(2.0或更高版本)支持写入时创建表.

原来的答案

可以写入现有的表但是现在看来(Spark 1.5.0)还不支持使用JDBC数据源创建表*.您可以查看SPARK-7646以供参考.

如果表已经存在,您可以简单地使用DataFrameWriter.jdbc方法:

val prop: java.util.Properties = ???
df.write.jdbc("jdbc:mysql://localhost/foo", "foo.bar2", prop)
Run Code Online (Sandbox Code Playgroud)

*有趣的是PySpark似乎支持使用jdbc方法创建表.

  • 谢谢,这与添加保存模式完美配合; 即`df.write.mode(SaveMode.Overwrite).jdbc("jdbc:mysql:// localhost/foo","foo.bar2",prop) (2认同)