【问题标题】:Whats the difference between sq.read.jdbc and sq.read.format('jdbc')?sq.read.jdbc 和 sq.read.format('jdbc') 有什么区别?
【发布时间】:2016-10-16 15:43:59
【问题描述】:

我正在使用 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版本会报错?

【问题讨论】:

  • 方法应该大致相同,但这些调用不是。在第一种情况下,您没有提供driver 参数。
  • 谢谢你,但spark.apache.org/docs/1.6.1/api/python/… 我真的不知道是否可以提供该参数。当我尝试包含driver="..." 时,它会抛出一个错误,说“驱动程序”是一个未知键

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 2017-05-19
    • 2015-11-24
    • 1970-01-01
    • 2014-11-21
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    相关资源
    最近更新 更多