我看过多个帖子,但是聚合是在多个列上完成的,但是我希望基于以下条件 基于col OPTION_CD进行聚合: 如果数据框查询附加了条件,这将给我错误'DataFrame'对象没有属性'_get_object_id'
如果为NULL(STRING AGG(OPTION_CD,''按OPTION_CD排序),'')。 我能理解的是,如果OPTION_CD col为null,则放置一个空格,否则将OPTION_CD附加在一行中,并用空格分隔。以下是示例表:
首先要进行过滤以从COl 1中仅获取1和2,然后结果应如下所示:
以下是我在数据框上写的查询
df_result = df.filter((df.COL1 == 1)|(df.COL1 == 2)).select(df.COL1,df.COL2,(when(df.OPTION_CD == "NULL", " ").otherwise(df.groupBy(df.OPTION_CD))).agg(
collect_list(df.OPTION_CD)))
但未获得理想的结果。有人可以帮忙吗?我正在使用pyspark。
答案 0 :(得分:1)
您对问题的表达不够清楚,但我会尽力回答。
您需要了解,数据框列的所有行只能具有一种数据类型。如果初始数据是整数,则不能使用空字符串而是使用Null值来检查字符串是否相等。
同样,collect list返回一个整数数组,因此,一行中不能有[7,5],另一行中不能有“'”。无论如何,这对您有用吗?
from pyspark.sql.functions import col, collect_list
listOfTuples = [(1, 3, 1),(2, 3, 2),(1, 4, 5),(1, 4, 7),(5, 5, 8),(4, 1, 3),(2,4,None)]
df = spark.createDataFrame(listOfTuples , ["A", "B", "option"])
df.show()
>>>
+---+---+------+
| A| B|option|
+---+---+------+
| 1| 3| 1|
| 2| 3| 2|
| 1| 4| 5|
| 1| 4| 7|
| 5| 5| 8|
| 4| 1| 3|
| 2| 4| null|
+---+---+------+
dfFinal = df.filter((df.A == 1)|(df.A == 2)).groupby(['A','B']).agg(collect_list(df['option']))
dfFinal.show()
>>>
+---+---+--------------------+
| A| B|collect_list(option)|
+---+---+--------------------+
| 1| 3| [1]|
| 1| 4| [5, 7]|
| 2| 3| [2]|
| 2| 4| []|
+---+---+--------------------+