是什么区别sq.read.jdbc和sq.read.format(' jdbc')?

时间:2016-06-15 13:29:07

标签: mysql jdbc apache-spark apache-spark-sql

我正在使用Spark连接到本地mysql实例。

我有一个我传入的mysql jdbc jar:

pyspark --jars /path/to/jar

我创建了我的SQLContext等等。我开始做连接的东西,一个版本抛出错误而另一个版本没有。

SQLContext.read.jdbc(url="jdbc:mysql://localhost:3306?user=root", table="spark.words")

这会引发找不到驱动程序的错误。

SQLContext.read.format("jdbc").option("url","jdbc:mysql://localhost:3306?user=root").option("dbtable","spark.words").option("driver", 'com.mysql.jdbc.Driver').load()

这可以按预期工作。

我认为这两者大致相同,前者是后者的便利方法。有什么区别以及为什么SQLContext.read.jdbc版本出错?

1 个答案:

答案 0 :(得分:1)

一般来说,这两种方法应该是等效的,尽管可能存在事物不能按预期工作的边界情况(例如DataFrameWriter使用JDBC源似乎表示format("jdbc")之间的行为略有不同和jdbc(...))。

在这种特殊情况下,答案很简单。这些调用不等效,因为第二个解决方案是明确声明驱动程序类,而第一个解决方案不是。

如果您希望它们的行为方式相同,则应提供properties dict

sqlContext.read.jdbc(
    url=..., table=...,
    properties={"driver": "com.mysql.jdbc.Driver"})