前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pyspark列合并为一行

pyspark列合并为一行

作者头像
机器学习和大数据挖掘
发布2019-07-01 18:27:11
2.4K0
发布2019-07-01 18:27:11
举报
文章被收录于专栏:数据挖掘数据挖掘

dataframe 利用 pyspark 列合并为一行,类似于 sqlGROUP_CONCAT 函数。例如如下 dataframe :

代码语言:javascript
复制
+----+---+
|   s|  d|
+----+---+
|abcd|123|
| asd|123|
+----+---+

需要按照列相同的列 ds 合并,想要的结果为:

代码语言:javascript
复制
+---+-----------+
|  d|     newcol|
+---+-----------+
|123|[abcd, xyz]|
+---+-----------+

利用 groupby 去实现就好,spark 里面可以用 concat_ws 实现,可以看这个 Spark中SQL列合并为一行,而这里的 concat_ws 合并缺很奇怪,官方文档的实例为:

代码语言:javascript
复制
>>> df = spark.createDataFrame([('abcd','123')], ['s', 'd'])
>>> df.select(concat_ws('-', df.s, df.d).alias('s')).collect()
[Row(s=u'abcd-123')]

作者自己尝试得到:

代码语言:javascript
复制
from pyspark.sql import SparkSession
from pyspark.sql.functions import concat_ws

# 初始化spark会话
spark = SparkSession \
    .builder \
    .appName("test") \
    .master("local") \
    .getOrCreate()

df = spark.createDataFrame([('abcd','123'),('xyz','123')], ['s', 'd'])
df.show()
df.select(concat_ws('-', df.s, df.d).alias('newcol')).show()
代码语言:javascript
复制
+--------+
|  newcol|
+--------+
|abcd-123|
| xyz-123|
+--------+

不是想要的效果。而 collect_list 能得到相同的效果:

代码语言:javascript
复制
from pyspark.sql import SparkSession
from pyspark.sql.functions import concat_ws
from pyspark.sql.functions import collect_list

# 初始化spark会话
spark = SparkSession \
    .builder \
    .appName("test") \
    .master("local") \
    .getOrCreate()

df = spark.createDataFrame([('abcd','123'),('xyz','123')], ['s', 'd'])
df.show()
df.groupBy("d").agg(collect_list('s').alias('newcol')).show()

得到的结果为:

代码语言:javascript
复制
+---+-----------+
|  d|     newcol|
+---+-----------+
|123|[abcd, xyz]|
+---+-----------+
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档