假设我有以下DataFrame。
import pyspark.sql.functions as f
from pyspark.sql.window import Window
l =[( 9 , 1, 'A' ),
( 9 , 2, 'B' ),
( 9 , 3, 'C' ),
( 9 , 4, 'D' ),
( 10 , 1, 'A' ),
( 10 , 2, 'B' )]
df = spark.createDataFrame(l, ['prod','rank', 'value'])
df.show()
prod | rank | value |
---|---|---|
9 | 1 | A |
9 | 2 | B |
9 | 3 | C |
9 | 4 | D |
10 | 1 | A |
10 | 2 | B |
如何创建一个带有数组的新框架,其中value列的值基于rank?
期望的输出:
l =[( 9 , ['A','B','C','D'] ),
( 10 , ['A','B'])]
l = spark.createDataFrame(l, ['prod', 'conc'])
prod | conc |
---|---|
9 | [A, B, C, D] |
10 | [A, B] |
df = df.orderBy(["prod", "rank"], ascending=[1, 1])
df = df.rdd.map(lambda r: (r.prod, r.value)).reduceByKey(lambda x,y: list(x) + list(y)).toDF(['prod','conc'])
df.show() | |
---|---|
prod | conc |
9 | [A, B, C, D] |
10 | [A, B] |
+----+------------+
这是基于您指定的快速解决方案。
w = Window.partitionBy('prod').orderBy('rank')
desiredDF = df.withColumn('values_list', f.collect_list('value').over(w)).groupBy('prod').agg(f.max('values_list').alias('conc'))
desiredDF.show()
prod | conc |
---|---|
9 | [A, B, C, D] |
10 | [A, B] |
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。