【问题标题】:pyspark Column is not iterablepyspark 列不可迭代
【发布时间】:2016-08-23 19:41:00
【问题描述】:

拥有这个数据框,当我尝试 groupBy 并获得最大值时,我得到的 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

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    这是因为,您已经覆盖了 apache-spark 提供的 max 定义,很容易发现,因为 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")))
    

    【讨论】:

    • 哎呀:...我
    【解决方案2】:

    惯用风格可以避免这个问题——不幸的是,一些Spark SQL函数名Python内置函数名之间的命名空间冲突> -- 是import Spark SQL functions module 这样的:

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

    实际上,这是惯用避免问题的方法。 =:)

    【讨论】:

    • 这种方法实际上很简单,而且效果很好。
    • 如果我在 Python 中创建了 UDF?有没有办法将它应用于所有列?想想……你创建了一个函数 UDF 来应用没有特殊字符和大写的默认格式。
    • 嗨@FernandoDelago 这个问题可能对您有所帮助:stackoverflow.com/questions/34037889/…
    【解决方案3】:

    我遇到了类似的问题,虽然错误看起来很恶作剧,但我们可以解决同样的问题来检查我们是否错过了以下导入-

    从 pyspark.sql.functions 导入 *

    如果列的数据类型正确,这将获得聚合数据所需的函数。我通过添加所需的导入解决了类似的问题,所以不要忘记检查...

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      相关资源
      最近更新 更多