pyspark列不可迭代

时间:2016-04-28 20:28:20

标签: apache-spark pyspark

当我尝试groupBy并获得max时,拥有这个数据帧我得到的列是不可迭代的:

linesWithSparkDF
+---+-----+
| id|cycle|
+---+-----+
| 31|   26|
| 31|   28|
| 31|   29|
| 31|   97|
| 31|   98|
| 31|  100|
| 31|  101|
| 31|  111|
| 31|  112|
| 31|  113|
+---+-----+
only showing top 10 rows


ipython-input-41-373452512490> in runlgmodel2(model, data)
     65     linesWithSparkDF.show(10)
     66 
---> 67     linesWithSparkGDF = linesWithSparkDF.groupBy(col("id")).agg(max(col("cycle")))
     68     print "linesWithSparkGDF"
     69 

/usr/hdp/current/spark-client/python/pyspark/sql/column.py in __iter__(self)
    241 
    242     def __iter__(self):
--> 243         raise TypeError("Column is not iterable")
    244 
    245     # string methods

TypeError: Column is not iterable

2 个答案:

答案 0 :(得分:15)

这是因为,您已覆盖max提供的apache-spark定义,很容易发现,因为max期待iterable

要解决此问题,您可以使用a different syntax,它应该有效。

inesWithSparkGDF = linesWithSparkDF.groupBy(col("id")).agg({"cycle": "max"})

或者

from pyspark.sql.functions import max as sparkMax

linesWithSparkGDF = linesWithSparkDF.groupBy(col("id")).agg(sparkMax(col("cycle")))

答案 1 :(得分:0)

避免此问题的一般方法(实际上是与Python内置函数的名称空间冲突)是import Spark SQL functions,如下所示:

from pyspark.sql import functions as F # USAGE: F.col(), F.max(), ...

然后,以OP的示例为例,应用F

linesWithSparkGDF = linesWithSparkDF.groupBy(F.col("id")) \
                                    .agg(F.max(F.col("cycle")))