2016-06-28 17 views
0

所以這裏是什麼,我試圖做一些示例代碼:一個groupByKey(後總結DenseVectors)工作在Pyspark外殼,但沒有火花提交

首先,我要建語句特徵向量使用Word2Vec:

from pyspark.ml.feature import Word2Vec 

# Input data: Each row is a bag of words from a sentence or document. 
documentDF = sqlContext.createDataFrame([ 
    ("Hi I heard about Spark".split(" "),), 
    ("I wish Java could use case classes".split(" "),), 
    ("Logistic regression models are neat".split(" "),) 
], ["text"]) 
# Learn a mapping from words to Vectors. 
word2Vec = Word2Vec(vectorSize=3, minCount=0, inputCol="text", outputCol="result") 
model = word2Vec.fit(documentDF) 
result = model.transform(documentDF) 

Converting output result to an RDD: 
result_rdd=result.select("result").rdd 
rdd_with_sample_ids_attached = result_rdd.map(lambda x: (1, x[0])) 
rdd_with_sample_ids_attached.collect() 

輸出: [(1,DenseVector([0.0472,-0.0078,0.0377)),(1,DenseVector([ - 0.0253,-0.0171,0.0664]) ),(1,DenseVector([0.0101,0.0324,0.0158]))]

現在,我做groupByKey()和發現各組中的DenseVectors的總和如下:

rdd_sum = rdd_with_sample_ids_attached.groupByKey().map(lambda x: (x[0], sum(x[1]))) 
rdd_sum.collect() 

輸出: [(1,DenseVector([0.0319, 0.0075,0.1198]))]

如圖所示,此代碼在pyspark外殼中完美工作。然而,當我提出相同的代碼火花提交,我得到以下錯誤:

File "/mnt1/yarn/usercache/hadoop/appcache/application_1465567204576_0170/container_1465567204576_0170_01_000002/pyspark.zip/pyspark/sql/functions.py", line 39, in _ 
    jc = getattr(sc._jvm.functions, name)(col._jc if isinstance(col, Column) else col) 
AttributeError: 'NoneType' object has no attribute '_jvm' 

我試圖重新分區RDD到單個分區,同樣的錯誤。 請幫忙嗎?

+0

錯誤提示'sc'是'NoneType'。也許你正在處理一個大型數據集並且你的集羣已經死了?這是非常可能的。你正在使用'groupByKey',它需要足夠大的內存來容納任何鍵和它的值。 – ShuaiYuan

+0

'groupByKey'後面的lambda函數不給總和 – ShuaiYuan

+0

嘿!不,我嘗試使用上面發佈的同一樣本數據集。同樣的錯誤。在pyspark外殼中工作,當我點燃.py文件中的相同代碼時不起作用。另外,lambda函數確實做了一筆 - 這是一個錯誤的問題。我在問題中編輯了我的代碼。 我可以展開與分組標識關聯的DenseVectors列表,也可以執行len()操作。它只是失敗的總和()。令人沮喪的是,它在pyspark外殼和ipython筆記本上工作,所以我覺得我在這裏錯過了一些東西。 –

回答

1

想通了! 問題是,我在我的劇本有一個導入功能如下:

from pyspark.sql.functions import * 

該進口取代了內置Python的總和之和()()函數。當我刪除這個導入功能時,它工作正常。當pythonic inbuilt sum()函數能夠添加DenseVectors時,從pyspark.sql.functions導入的sum()不能這樣做。

+0

千萬不要'輸入*' – ShuaiYuan

+0

顯然這不是你的問題:) – ShuaiYuan