PySpark 聚合和分组依据

PySpark Aggregation and Group By

我看过多个帖子,但聚合是在多个列上完成的,但我想要基于 col OPTION_CD 的聚合,基于以下 条件: 如果有条件附加到数据框查询,这会给我错误 'DataFrame' object has no attribute '_get_object_id'

IF NULL(STRING AGG(OPTION_CD,'' 按 OPTION_CD 排序),'')。 我能理解的是,如果 OPTION_CD col 为空,则放置一个空白,否则将 OPTION_CD 附加到由 blank.Following 分隔的一行中,样本 table :

首先过滤从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。

你的问题表达的不够清楚,我会尽量回答的。

您需要了解数据框列的所有行只能有一种数据类型。如果您的初始数据是整数,那么您不能检查字符串是否与空字符串相等,而是检查 Null 值。

同时收集 list returns 一个整数数组,因此您不能在一行中有 [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|                  []|
+---+---+--------------------+