pyspark - 在pyspark中组合来自多行的文本

标签 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)

结果:

category    name
A           A1
A           A2
B           B1
B           B2

我想让它显示如下:

category    name
A           A1, A2
B           B1, B2

我尝试了以下不起作用的代码

spark_df.groupby('category').agg('name', lambda x:x + ', ')

任何人都可以帮助确定我做错了什么以及实现这一目标的最佳方法吗?

最佳答案

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

from pyspark.sql.functions import collect_list
grouped_df = spark_df.groupby('category').agg(collect_list('name').alias("name"))

这将收集 name 的值进入一个列表,结果输出将如下所示:

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

更新 2019-06-10:
如果您希望将输出作为连接字符串,您可以使用 pyspark.sql.functions.concat_ws 连接收集到的列表的值,即 better than using a udf :

from pyspark.sql.functions import concat_ws

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

原答案 :如果您希望将输出作为连接字符串,则必须使用 udf .例如,您可以先做 groupBy()如上所述,并申请 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 |
#+---------+-------+

关于pyspark - 在pyspark中组合来自多行的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49468362/

相关文章:

apache-spark - 我如何将时间戳作为额外的列添加到我的数据框

Pandas udf 遍历 PySpark 数据帧行

hadoop - 在 EMR Spark 上,JDBC 加载第一次失败,然后工作

casting - Pyspark:将列从字符串类型转换为时间戳类型

python - 转换 Python Lambda 函数而不将值返回给 Pyspark

pyspark - 列类型中的 Spark 错误

python-2.7 - Spark 2.3.0读取带有标题选项的文本文件不起作用

python - 假设未安装 'openpyxl' 模块,将 pyspark 中的数据框导出到 excel 文件

azure - 使用 JDBC 从 Pyspark 更新表

python - 'GroupedData' 对象在 Spark 数据帧中执行透视时没有属性 'show'