pyspark 使用 agg 在 groupBy 之后连接字符串

loo*_*ass 1 python apache-spark pyspark

在 pandas 数据框中,我能够做到

df2 = df.groupBy('name').agg({'id': 'first', 'grocery': ','.join})
Run Code Online (Sandbox Code Playgroud)

从

name        id        grocery
Mike        01        Apple
Mike        01        Orange
Kate        99        Beef
Kate        99        Wine
Run Code Online (Sandbox Code Playgroud)

到

name        id        grocery
Mike        01        Apple,Orange
Kate        99        Beef,Wine
Run Code Online (Sandbox Code Playgroud)

由于同一个人的多行 id 是相同的,所以我只为每个人取第一个,然后连接杂货店。

我似乎无法在 pyspark 中完成这项工作。我怎样才能在 pyspark 中做同样的事情?我希望杂货店是字符串而不是列表

Psi*_*dom 9

用于collect_list将元素收集到列表中,然后使用以下命令将列表作为字符串连接concat_ws:

import pyspark.sql.functions as f

df.groupBy("name")
  .agg(
      f.first("id").alias("id"), 
      f.concat_ws(",", f.collect_list("grocery")).alias("grocery")
   ).show()

#+----+---+------------+
#|name| id|     grocery|
#+----+---+------------+
#|Kate| 99|   Beef,Wine|
#|Mike| 01|Apple,Orange|
#+----+---+------------+
Run Code Online (Sandbox Code Playgroud)