olu*_*ies 9 apache-spark pyspark
当我尝试groupBy并获得max时,拥有这个数据帧我得到Column是不可迭代的:
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
Run Code Online (Sandbox Code Playgroud)
Alb*_*nto 22
这是因为,你已经覆盖了max提供的定义apache-spark,很容易发现,因为max期待一个iterable.
要解决此问题,您可以使用不同的语法,它应该可以工作.
inesWithSparkGDF = linesWithSparkDF.groupBy(col("id")).agg({"cycle": "max"})
Run Code Online (Sandbox Code Playgroud)
或者
from pyspark.sql.functions import max as sparkMax
linesWithSparkGDF = linesWithSparkDF.groupBy(col("id")).agg(sparkMax(col("cycle")))
Run Code Online (Sandbox Code Playgroud)
NYC*_*yes 18
该惯用的风格,以避免这个问题-这是一些不幸之间的空间冲突星火SQL函数名和Python的内置函数的名字-就是import在Spark SQL functions module这样的:
from pyspark.sql import functions as F
# USAGE: F.col(), F.max(), F.someFunc(), ...
Run Code Online (Sandbox Code Playgroud)
然后,使用该OP's示例,您只需F像这样应用:
linesWithSparkGDF = linesWithSparkDF.groupBy(F.col("id")) \
.agg(F.max(F.col("cycle")))
Run Code Online (Sandbox Code Playgroud)
在实践中,这就是如何惯用地避免问题。=:)
| 归档时间: |
|
| 查看次数: |
17929 次 |
| 最近记录: |