首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pyspark groupby然后在组内排序

Pyspark groupby然后在组内排序
EN

Stack Overflow用户
提问于 2017-08-16 22:33:27
回答 2查看 2K关注 0票数 6

我有一个包含id,offset,text的表。假设输入:

代码语言:javascript
运行
复制
id offset text
1  1      hello 
1  7      world
2  1      foo

我想要如下输出:

代码语言:javascript
运行
复制
id text
1  hello world
2  foo

我使用的是:

代码语言:javascript
运行
复制
df.groupby(id).agg(concat_ws("",collect_list(text))

但我不知道如何确保文本中的顺序。我在groupby数据之前做了sort,但我听说groupby可能会对数据进行混洗。在groupby数据之后,有没有办法在组内做sort

EN

回答 2

Stack Overflow用户

发布于 2019-08-06 05:09:23

这将创建所需的df:

代码语言:javascript
运行
复制
df1 = sqlContext.createDataFrame([("1", "1","hello"), ("1", "7","world"), ("2", "1","foo")], ("id", "offset" ,"text" ))
display(df1)

然后你可以使用下面的代码,可以进一步优化:

代码语言:javascript
运行
复制
@udf
def sort_by_offset(col):
  result =""
  text_list = col.split("-")
  for i in range(len(text_list)):
    text_list[i] = text_list[i].split(" ")
    text_list[i][0]=int(text_list[i][0])
  text_list = sorted(text_list, key=lambda x: x[0], reverse=False)
  for i in range(len(text_list)):
    result = result+ " " +text_list[i][1]
  return result.lstrip()
df2 = df1.withColumn("offset_text",concat(col("offset"),lit(" "),col("text")))
df3 = df2.groupby(col("id")).agg(concat_ws("-",collect_list(col("offset_text"))).alias("offset_text"))
df4 = df3.withColumn("text",sort_by_offset(col("offset_text")))
display(df4)

最终输出:

票数 1
EN

Stack Overflow用户

发布于 2017-08-17 00:35:32

添加sort_array

代码语言:javascript
运行
复制
from pyspark.sql.functions import sort_array

df.groupby(id).agg(concat_ws("", sort_array(collect_list(text))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45716436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档