合并pyspark中多行的文本

Har*_*rry 3 pyspark spark-dataframe

我使用以下代码创建了一个PySpark数据框

testlist = [
             {"category":"A","name":"A1"}, 
             {"category":"A","name":"A2"}, 
             {"category":"B","name":"B1"},
             {"category":"B","name":"B2"}
]

spark_df = spark.createDataFrame(testlist)
Run Code Online (Sandbox Code Playgroud)

结果:

category    name
A           A1
A           A2
B           B1
B           B2
Run Code Online (Sandbox Code Playgroud)

我想使其显示如下:

category    name
A           A1, A2
B           B1, B2
Run Code Online (Sandbox Code Playgroud)

我尝试了以下无效的代码

spark_df.groupby('category').agg('name', lambda x:x + ', ')
Run Code Online (Sandbox Code Playgroud)

谁能帮助您确定我做错了什么以及实现这一目标的最佳方法?

pau*_*ult 5

一种选择是pyspark.sql.functions.collect_list()用作聚合函数。

from pyspark.sql.functions import collect_list
grouped_df = spark_df.groupby('category').agg(collect_list('name').alias("name"))
Run Code Online (Sandbox Code Playgroud)

这会将值收集name到一个列表中,结果输出如下所示:

grouped_df.show()
#+---------+---------+
#|category |name     |
#+---------+---------+
#|A        |[A1, A2] |
#|B        |[B1, B2] |
#+---------+---------+
Run Code Online (Sandbox Code Playgroud)

更新 2019-06-10:如果您希望将输出作为串联字符串,则可以使用pyspark.sql.functions.concat_ws串联收集列表的值,这将比使用udf

from pyspark.sql.functions import concat_ws

grouped_df.withColumn("name", concat_ws(", ", "name")).show()
#+---------+-------+
#|category |name   |
#+---------+-------+
#|A        |A1, A2 |
#|B        |B1, B2 |
#+---------+-------+
Run Code Online (Sandbox Code Playgroud)

原来的答案:如果你想为一个连接字符串,你的输出,你必须 可以使用udf。例如,您可以先执行groupBy()上述操作,然后将a udf应用于加入收集的列表:

from pyspark.sql.functions import udf
concat_list = udf(lambda lst: ", ".join(lst), StringType())

grouped_df.withColumn("name", concat_list("name")).show()
#+---------+-------+
#|category |name   |
#+---------+-------+
#|A        |A1, A2 |
#|B        |B1, B2 |
#+---------+-------+
Run Code Online (Sandbox Code Playgroud)