2017-05-20 67 views
1

我正在從書中練習,但不喜歡SQLContext.load被使用的方式。第一步啓動具有特定參數的pyspark:SQLContext vs DataFrameLoader

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" 
...) 

現在,我應該在的結束與employees.rdd.getNumPartitions(),但前跟進以前的字符串,我得到的錯誤「AttributeError的:‘SQLContext’對象有沒有屬性‘負荷’

這本書似乎早已預料到這一點,因爲它說,「檢查API文檔星火的版本,正在使用,更多的重新我們鼓勵您使用加載方法從DataFrameReader對象而不是 SQLContext「。

所以,我試圖同樣的例子,除了用「sqlctx」與「DataFrameReader」:

>>> 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" 
...) 

我然後得到錯誤:「類型錯誤:未結合的方法負載()必須與DataFrameReader例如作爲被稱爲第一個參數(沒有任何代替)「所以我懷疑我錯誤地使用了DataFrameReader,但儘管查看了文檔,我無法確定它的正確用法。誰能告訴我我做錯了什麼?預先感謝您的幫助。

(火花版本2.1.1)

回答

1

SQLContext是不加載用於火花2.x的數據的優選方式;它是爲了向後兼容而存在的。使用spark.read.jdbc其中spark是一個SparkSession對象。 SparkSession是訪問以前封裝在SparkContext和SQLContext中的所有內容的最新和現代的方式。我推薦Jacek的git手冊,主要介紹當前Spark API(2.x)的一本驚人指南,以及關於Spark的所有內容。

+0

謝謝你,加倫。據我所知,一些論點也不一樣?例如,而不是「源」,spark.read.jdbc使用「url」代替 - 我想。 –

+0

是的,方法是不同的。我寫了一篇博客文章,我相信這個話題的答案是這樣的,但是不想在我的答案中提供相關細節時不想鏈接。 – Garren

+0

找到我的相關答案之一(不介意安全上下文):http ://stackoverflow.com/a/43358294/1942007 – Garren

相關問題