Apache spark SQLContext与DataFrameLoader

Apache spark SQLContext与DataFrameLoader,apache-spark,jdbc,pyspark,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) 接下来是有争议的部分: >&g

我是从一本书中的一个练习开始工作的,但它不喜欢使用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"
... )
>employeesdf=sqlctx.load(source=“jdbc”,
…url=“jdbc:mysql://localhost:3306/employees?user=&password=",
…dbtable=“employees”,
…partitionColumn=“emp_no”,
…numPartitions=“2”,
…lowerBound=“10001”,
…上限=“499999”
... )
现在,我应该用employees.rdd.getNumPartitions()来跟进这个问题,但是在上一个字符串的末尾,我得到了错误“AttributeError:'SQLContext'对象没有属性'load'

这本书似乎已经预见到了这一点,因为它说,“查看API文档,了解您正在使用的Spark版本,在更新的版本中,鼓励您使用DataFrameReader对象的load方法,而不是SQLContext。”

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

employeesdf=DataFrameReader.load(source=“jdbc”, …url=“jdbc:mysql://localhost:3306/employees?user=password=", …dbtable=“employees”, …partitionColumn=“emp_no”, …numPartitions=“2”, …lowerBound=“10001”, …上限=“499999” ... ) 然后我得到了错误:“类型错误:必须使用DataFrameReader实例作为第一个参数调用unbound method load()”,因此我怀疑我使用DataFrameReader不正确,但尽管查看了文档,我还是无法说出正确的用法。谁能告诉我我做错了什么?提前感谢您的帮助


(Spark版本是2.1.1)

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

谢谢你,Garren。据我所知,有些论点也不同?比如说,spark.read.jdbc不用“source”,而是用“url”——我想是的,方法是不同的。我写了一篇博客文章,我相信关于这个主题的答案是肯定的,但我不想在没有能够在我的回答中提供相关细节的情况下进行链接。我发现了我的一个相关答案(不介意安全上下文):再次感谢,我会看看这篇文章。
>>> 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"
... )