AttributeError:' DataFrame'对象没有属性' map'

时间:2016-09-16 15:44:46

标签: python apache-spark pyspark spark-dataframe apache-spark-mllib

我想使用下面的代码转换火花数据框:

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'

有谁知道我在这里做错了什么?谢谢!

2 个答案:

答案 0 :(得分:61)

您不能map数据框,但您可以将数据框转换为RDD并通过spark_df.rdd.map()进行映射。在Spark 2.0之前,spark_df.map将别名为spark_df.rdd.map()。使用Spark 2.0,您必须先显式调用.rdd

答案 1 :(得分:0)

您可以使用 df.rdd.map(),因为 DataFrame 没有 mapflatMap,但要注意使用 df.rddimplications :

<块引用>

转换为 RDD 打破了 Dataframe 沿袭,没有谓词下推,没有列修剪,没有 SQL 计划和效率较低的 PySpark 转换。

你应该怎么做?

请记住,高级 DataFrame API 配备了许多替代方案。首先,您可以使用 selectselectExpr

另一个example正在使用explode而不是flatMap(存在于RDD中):

df.select($"name",explode($"knownLanguages"))
    .show(false)

结果:

+-------+------+
|name   |col   |
+-------+------+
|James  |Java  |
|James  |Scala |
|Michael|Spark |
|Michael|Java  |
|Michael|null  |
|Robert |CSharp|
|Robert |      |
+-------+------+

您还可以使用 withColumnUDF,具体取决于用例,或 DataFrame API 中的其他选项。