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| []|
+---+---+--------------------+
我看过多个帖子,但聚合是在多个列上完成的,但我想要基于 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| []|
+---+---+--------------------+