我有这个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|
+---+----------------+
如果有人有任何想法,请告诉我
答案 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("*")