SQLContext与DataFrameLoader

时间:2017-05-20 01:52:35

标签: apache-spark jdbc pyspark

我正在书中练习,但它并不喜欢使用SQLContext.load的方式。第一步是使用特定参数启动pyspark:

pyspark --driver-class-path /usr/share/java/mysql-connector-java-5.1.39-bin.jar --master local

这很好。接下来,导入:

from pyspark.sql import SQLContext
sqlctx = SQLContext(sc)

然后是有争议的部分:

>>> employeesdf = sqlctx.load(source="jdbc",
... url="jdbc:mysql://localhost:3306/employees?user=<user>&password=<pwd>",
... dbtable="employees",
... partitionColumn="emp_no",
... numPartitions="2",
... lowerBound="10001",
... upperBound="499999"
... )

现在,我应该跟employee.rdd.getNumPartitions()进行跟进,但是在上一个字符串结束之前,我得到错误“ AttributeError:'SQLContext'对象没有属性'加载“

本书似乎已经预料到了这一点,因为它说:“检查API文档中是否有您正在使用的Spark版本,在最近的版本中,我们鼓励您使用 load 方法。 DataFrameReader 对象而不是的SQLContext。“

所以我尝试了相同的例子,除了用“DataFrameReader”代替“sqlctx”:

>>> employeesdf = DataFrameReader.load(source="jdbc",
... url="jdbc:mysql://localhost:3306/employees?user=<user>password=<pwd>",
... dbtable="employees",
... partitionColumn="emp_no",
... numPartitions="2",
... lowerBound="10001",
... upperBound="499999"
... )

然后我得到错误:“ TypeError:非绑定方法load()必须使用DataFrameReader实例作为第一个参数调用(没有取而代之)”所以我怀疑我正在使用 DataFrameReader 错误,但尽管查看了文档,但我无法确定正确使用的是什么。谁能告诉我我做错了什么?提前感谢您的任何帮助。

(Spark版本为2.1.1)

1 个答案:

答案 0 :(得分:1)

SQLContext不是加载spark 2.x数据的首选方法;它的存在是为了向后兼容。使用spark.read.jdbc其中spark是SparkSession对象。 SparkSession是访问以前封装在SparkContext和SQLContext中的所有内容的最新和现代方式。我推荐Jacek关于掌握火花的git book,以获得当前Spark API(2.x)的精彩指南,以及一般的Spark。