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)
谁能帮助您确定我做错了什么以及实现这一目标的最佳方法?
一种选择是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)
| 归档时间: |
|
| 查看次数: |
3291 次 |
| 最近记录: |