PySpark聚合和分组依据

时间:2018-06-26 09:40:52

标签: pyspark pyspark-sql

我看过多个帖子,但是聚合是在多个列上完成的,但是我希望基于以下条件 基于col OPTION_CD进行聚合: 如果数据框查询附加了条件,这将给我错误'DataFrame'对象没有属性'_get_object_id'

如果为NULL(STRING AGG(OPTION_CD,''按OPTION_CD排序),'')。 我能理解的是,如果OPTION_CD col为null,则放置一个空格,否则将OPTION_CD附加在一行中,并用空格分隔。以下是示例表:

original CSV on which df is create

首先要进行过滤以从COl 1中仅获取1和2,然后结果应如下所示: enter image description here

以下是我在数据框上写的查询

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。

1 个答案:

答案 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|                  []|
+---+---+--------------------+