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

私は、Pythonではそれがほぼ疑問に思っていますが、それ以上は区別できません。実際にgithubコードを参照すると、1.6.1ではさまざまなデータフレームメソッドがデータフレームモジュールにあり、2.0では同じメソッドがデータセットモジュールにあり、データフレームモジュールはありません。ですから、少なくともPython APIでは、データフレームとデータセットの間の変換に関する問題に直面することはありません。 – Jeff

答えて

36

データフレームはmapできませんが、データフレームをRDDに変換し、spark_df.rdd.map()を実行してマップすることができます。 Spark 2.0以前は、spark_df.mapspark_df.rdd.map()という別名でした。 Spark 2.0では、最初に.rddを明示的に呼び出す必要があります。

+0

これは、spark 2.0でのデータフレームの主な変更の1つです – Mostafa

関連する問題