首页 文章

PySpark聚合和分组依据

提问于
浏览
0

我看过多个帖子,但聚合是在多个列上完成的,但我希望基于col OPTION_CD进行聚合,基于以下 condition: If have conditions attached to the dataframe query, which is giving me the error 'DataFrame' object has no attribute '_get_object_id'

IF 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 回答

  • 1

    你没有清楚地表达你的问题,但我会尽力回答 .

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

    收集列表也返回一个整数数组,因此你不能在一行中有[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|                  []|
    +---+---+--------------------+
    

相关问题