14

chciałem przekonwertować ramkę danych iskra, aby dodać za pomocą poniższego kodu:AttributeError: obiekt „DataFrame” nie ma atrybutu „mapy”

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

Szczegółowy komunikat o błędzie:

--------------------------------------------------------------------------- 
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' 

Czy ktoś wie, co zrobiłem źle tutaj? Dzięki!

+1

Należy pamiętać, że MLLIB zbudowany jest wokół RDD, podczas gdy ML jest ogólnie zbudowany wokół ramek danych. Ponieważ wydaje się, że używasz Sparka 2.0, sugerowałbym, żebyś sprawdził KMeans z ML: https://spark.apache.org/docs/latest/ml-clustering.html – Jeff

+0

@JeffL: Sprawdziłem ml i zauważyłem że dane wejściowe muszą być danymi, a nie ramką danych. Więc musimy zrobić kolejną warstwę konwersji, aby przekonwertować ramkę danych na zbiór danych, aby użyć ml? – Edamame

+0

Nie jestem już w 100% jasna na rozróżnienie, choć w Pythonie uważam, że jest to prawie dyskusyjne. W rzeczywistości, jeśli przeglądasz kod gitubu, w 1.6.1 różne metody ramek danych są w module ramek danych, podczas gdy w 2.0 te same metody są w module zestawu danych i nie ma modułu ramek danych. Więc nie sądzę, że napotkasz jakiekolwiek problemy z konwersją między ramką danych a zestawem danych, przynajmniej w interfejsie API Pythona. – Jeff

Odpowiedz

36

Nie można map dataframe, ale można przekonwertować dataframe do RDD i map, które wykonując spark_df.rdd.map(). Przed Spark 2.0, spark_df.map byłby alias do spark_df.rdd.map(). W wersji Spark 2.0 musisz najpierw jednoznacznie wywołać .rdd.

+0

, jest to jedna z głównych zmian w ramkach danych w iskrze 2.0 – Mostafa