代码之家  ›  专栏  ›  技术社区  ›  YOLO

groupby并使用pyspark将多列转换为列表

  •  5
  • YOLO  · 技术社区  · 6 年前

    我在用pyspark。所以我有一个spark数据框,看起来像:

    a | b | c
    5 | 2 | 1
    5 | 4 | 3
    2 | 4 | 2
    2 | 3 | 7
    

    需要输出:

    a | b_list
    5 | 2,1,4,3
    2 | 4,2,3,7
    

    保持输出中给定的顺序很重要。

    2 回复  |  直到 6 年前
        1
  •  2
  •   YOLO    4 年前

    为了加入列表,我们可以使用 concat_ws 功能如上述注释所示,如下所示:

    import pyspark.sql.functions as F
    
    df = (df
          .withColumn('lst', F.concat(df['b'], F.lit(','), df['c']).alias('lst'))
          .groupBy('a')
          .agg( F.concat_ws(',', F.collect_list('lst').alias('b_list')).alias('lst')))
    
    df.show()
    
    +---+-------+
    |  a|    lst|
    +---+-------+
    |  5|2,1,4,3|
    |  2|4,2,3,7|
    +---+-------+
    
        2
  •  1
  •   ernest_k    6 年前

    最后2列中的以下结果聚合为一个数组列:

    df1 = df.withColumn('lst', f.concat(df['b'], f.lit(','), df['c']).alias('lst'))\
      .groupBy('a')\
      .agg( f.collect_list('lst').alias('b_list'))
    

    现在加入数组元素:

    #Simplistic udf to joing array:
    def join_array(col):
        return ','.join(col)
    
    join = f.udf(join_array)
    
    df1.select('a', join(df1['b_list']).alias('b_list'))\
      .show()
    

    正在打印:

    +---+-------+
    |  a| b_list|
    +---+-------+
    |  5|2,1,4,3|
    |  2|4,2,3,7|
    +---+-------+