14

我想火花數據幀轉換使用以下代碼來添加:AttributeError的:「數據幀」對象沒有屬性「地圖」

from pyspark.mllib.clustering import KMeans 
spark_df = sqlContext.createDataFrame(pandas_df) 
rdd = spark_df.map(lambda data: Vectors.dense([float(c) for c in data])) 
model = KMeans.train(rdd, 2, maxIterations=10, runs=30, initializationMode="random") 

詳細的錯誤信息是:

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-11-a19a1763d3ac> in <module>() 
     1 from pyspark.mllib.clustering import KMeans 
     2 spark_df = sqlContext.createDataFrame(pandas_df) 
----> 3 rdd = spark_df.map(lambda data: Vectors.dense([float(c) for c in data])) 
     4 model = KMeans.train(rdd, 2, maxIterations=10, runs=30, initializationMode="random") 

/home/edamame/spark/spark-2.0.0-bin-hadoop2.6/python/pyspark/sql/dataframe.pyc in __getattr__(self, name) 
    842   if name not in self.columns: 
    843    raise AttributeError(
--> 844     "'%s' object has no attribute '%s'" % (self.__class__.__name__, name)) 
    845   jc = self._jdf.apply(name) 
    846   return Column(jc) 

AttributeError: 'DataFrame' object has no attribute 'map' 

有人知道我在這裏做錯了嗎?謝謝!

+1

請記住,MLLIB是圍繞RDD構建的,而ML通常是圍繞數據框構建的。由於你似乎在使用Spark 2.0,我建議你從ML中查找KMeans:https://spark.apache.org/docs/latest/ml-clustering.html – Jeff

+0

@JeffL:我檢查了ml,我注意到輸入必須是數據集,而不是數據框。所以我們需要做另一層轉換來將數據框轉換爲數據集才能使用ml? – Edamame

+0

我不再100%清楚這個區別,儘管在Python中我相信它幾乎沒有實際意義。事實上,如果您瀏覽github代碼,則在1.6.1中,各種數據框方法位於數據框模塊中,而在2.0中,這些相同方法位於數據集模塊中,並且沒有數據框模塊。所以我不認爲你會面對數據框和數據集之間的任何轉換問題,至少在Python API中。 – Jeff

回答

36

您不能map數據幀,但您可以將數據幀轉換爲RDD並通過執行spark_df.rdd.map()進行映射。在Spark 2.0之前,spark_df.map將別名爲spark_df.rdd.map()。對於Spark 2.0,您必須首先明確呼叫.rdd

+0

對,這是Spark 2.0中數據框的主要變化之一 – Mostafa

相關問題