如何在数据类型为列表的数据框中迭代列

时间:2019-12-13 16:41:10

标签: python-3.x pyspark pyspark-sql pyspark-dataframes

我有这个DataFrame:

+----+----+---+
|NAME|RANK| ID|
+----+----+---+
|null|   1|100|
| abc|   5|100|
| cyz|   2|100|
+----+----+---+

我正在尝试访问列name,以便可以获取第一个非null元素,但出现错误:

  

TypeError:列不可迭代

这是我尝试过的:

grouped_df = df1.groupby('ID').agg(collect_list('NAME').alias("name")).select("*")

+---+----------------+
| ID|            name|
+---+----------------+
|100|[null, abc, cyz]|
+---+----------------+ 

grouped_df.withColumn('temp',next(s for s in grouped_df["name"] if s))

我可以使用getItem方法访问列表中的项目,但我正在尝试动态获取它

grouped_df.select("*").withColumn('finalName',grouped_df["name"].getItem(1))

我想要这样的输出

+---+----------------+
| ID|            name|
+---+----------------+
|100|             abc|
+---+----------------+

如果有人有任何想法,请告诉我

1 个答案:

答案 0 :(得分:0)

您正在尝试对Column对象应用Python进行理解(grouped_df["name"]返回Column not list)。

实际上,当您使用collect_list函数时,Spark会忽略空值,因此您无需获取数组中的第一个非空值,只需选择第一个元素:

grouped_df.withColumn('temp', col("name").getItem(0))

更好的方法是对groupBy进行分组,然后使用first函数选择第一个值:

grouped_df = df1.groupby('ID').agg(first(col('NAME'), ignorenulls=True).alias("name")).select("*")