Pyspark按组分组,然后对组内进行排序

8

我有一张包含id、偏移量和文本的表格。假设输入如下:

id offset text
1  1      hello 
1  7      world
2  1      foo

我想要的输出如下所示:

id text
1  hello world
2  foo

我正在使用:

df.groupby(id).agg(concat_ws("",collect_list(text))

但我不知道如何确保文本中的顺序。在 groupby 数据之前,我进行了 sort,但我听说 groupby 可能会打乱数据。有没有一种方法可以在 groupby 数据后对组内进行 sort


这个回答解决了你的问题吗?根据另一个变量保留顺序的collect_list - Neil
2个回答

1
这将创建一个必需的数据框(df):
df1 = sqlContext.createDataFrame([("1", "1","hello"), ("1", "7","world"), ("2", "1","foo")], ("id", "offset" ,"text" ))
display(df1)

然后您可以使用以下代码,可以进一步优化:
@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)

最终输出:

{{link1:Final Output}}


(注:这是一段HTML代码,翻译时保留了原文中的HTML标签和属性,不做解释。)

0
添加 sort_array:
from pyspark.sql.functions import sort_array

df.groupby(id).agg(concat_ws("", sort_array(collect_list(text))))

这样不行,我的排序键是偏移量,而不是字符串本身。 - Yunfei Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接