我想对pyspark配置单元表进行一些汇总。
我的桌子:
id value_tier ($)
105 5
117 5
108 10
110 12
105 10
112 10
我需要获取仅出现在一个“ value_tier”中的ID数量。
value_tier num
5 1 -- for 117
10 2 -- for 108 and 112
12 1 -- for 110
在此,不计105,因为它出现在两个value_tiers中。
5 and 10
我的SQL DDL可以工作,但是又长又难看。我想再优雅一点。谢谢
在DataFrameAPI中使用groupBy
和agg
withcollect_list
函数。
df1.show()
#+---+----------+
#| id|value_tier|
#+---+----------+
#|105| 5|
#|117| 5|
#|108| 10|
#|110| 12|
#|105| 10|
#|112| 10|
#+---+----------+
from pyspark.sql.functions import *
df1.groupBy("id").
agg(concat_ws(',',collect_list(col("value_tier"))).alias("value_tier")).\
filter(size(split(col("value_tier"),",")) <=1).\
groupBy("value_tier").\
agg(count(col("id")).alias("num"),concat_ws(",",collect_list(col("id"))).alias("ids")).\
show()
#+----------+---+-------+
#|value_tier|num| ids|
#+----------+---+-------+
#| 5| 1| 117|
#| 10| 2|112,108|
#| 12| 1| 110|
#+----------+---+-------+
#use collect_set to eliminate duplicates
df1.groupBy("id").
agg(concat_ws(',',collect_set(col("value_tier"))).alias("value_tier")).\
filter(size(split(col("value_tier"),",")) <=1).\
groupBy("value_tier").\
agg(count(col("id")).alias("num"),concat_ws(",",collect_list(col("id"))).alias("ids")).\
show()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句