pyspark列不可迭代

wnvonmuf  于 2023-03-28  发布在  Spark
关注(0)|答案(4)|浏览(133)

当我尝试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
j7dteeu8

j7dteeu81#

这是因为,你已经覆盖了apache-spark提供的max定义,很容易发现,因为max需要一个iterable
要解决这个问题,您可以使用不同的语法,它应该可以工作:

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

或者:

from pyspark.sql.functions import max as sparkMax

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

rhfm7lfc2#

避免这个问题的惯用方式是importSpark SQL functions module,这是一些Spark SQL函数名Python内置函数名之间不幸的命名空间冲突:

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

然后,使用OP's示例,您只需像这样应用F

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

在实践中,这是如何避免问题的**惯用 *. =:)

vojdkbi0

vojdkbi03#

我知道这个问题已经很老了,但这可能会帮助一些人。
首先导入以下内容:
from pyspark.sql import functions as F
然后
linesWithSparkGDF = linesWithSparkDF.groupBy(col("id")).agg(F.max(col("cycle")))

4si2a6ki

4si2a6ki4#

我遇到了类似的问题,虽然错误看起来很淘气,但我们可以解决同样的问题,检查我们是否错过了以下导入-
从pyspark.sql函数导入 *
如果列的数据类型正确,这将获得所需的函数来聚合数据。我通过添加所需的导入修复了类似的问题,所以不要忘记检查...

相关问题