【问题标题】:Pyspark column is not iteratablePyspark 列不可迭代
【发布时间】:2021-02-23 14:44:04
【问题描述】:

我有一个类似这样的df:

old_df = sqlContext.createDataFrame(
 [   ('375', 20),
     ('265', 20),
     ('052', 20),
     ('111', None),
 ],
['old_col', 'example_new_col_val'])

我需要通过对照列表检查旧列的值来创建新列。我是 Pyspark 的新手,不明白我的错误信息。这是我尝试过的:

from pyspark.sql import functions as F

my_list = ['375', '012', '013','014','015','016']
expr = F.when(F.col("old_col").isin(my_list),F.lit(20)).otherwise(None).alias("new_col")

new_df = old_df.select("*",*expr)   

我的错误信息:TypeError: Column is not iterable

【问题讨论】:

    标签: list apache-spark dictionary pyspark iterable


    【解决方案1】:

    定义my_list时,尝试使用:

    my_list = list(['375', '012', '013','014','015','016'].toPandas())
    

    其余代码保持不变。

    【讨论】:

      【解决方案2】:

      您需要在此处使用 withColumn() 函数来创建现有数据框的新 column

      df = df.withColumn("new_col", F.when(F.col("old_col").isin(my_list), F.lit("20")).otherwise(F.lit(None)))

      【讨论】:

      • df.select('*', expr) 是创建新列的一种完全有效的方法。事实上,它优于已知会导致性能下降的withColumn。见medium.com/@manuzhang/…
      • 是的。但我个人更喜欢分解步骤,而不是方法链接之类的狂热粉丝 :) 但感谢分享
      【解决方案3】:

      去掉*expr 中的* - expr 是一列,不应迭代/解包。

      new_df = old_df.select("*",expr)
      

      【讨论】:

      • 谢谢!我一直在做很多数据争论。这是我正在处理的一个更大问题的一部分。只是试图通过将其分解为更小的组件来解决它。
      猜你喜欢
      • 2016-08-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
      相关资源
      最近更新 更多