Sql 根据pyspark dataframe中另一列的值计数聚合一列
我想对pyspark配置单元表进行一些聚合 我的桌子:Sql 根据pyspark dataframe中另一列的值计数聚合一列,sql,dataframe,pyspark,hive,Sql,Dataframe,Pyspark,Hive,我想对pyspark配置单元表进行一些聚合 我的桌子: id value_tier ($) 105 5 117 5 108 10 110 12 105 10 112 10 我需要获得仅出现在一个值层中的ID数 value_tier num 5 1 -- for 117 10 2 -- for 108 and 112 12 1 -- for 110 这里不计算105,
id value_tier ($)
105 5
117 5
108 10
110 12
105 10
112 10
我需要获得仅出现在一个值层中的ID数
value_tier num
5 1 -- for 117
10 2 -- for 108 and 112
12 1 -- for 110
这里不计算105,因为它出现在两个价值层中
5 and 10
我的SQLDDL工作正常,但又长又丑。
我想要一个更优雅的。
感谢您在SQL中使用not exists(不存在)和aggregation(聚合):
sélect value_tier, count(*) cnt
from mytable t
where not exists(
select 1
from mytable t1
where t1.value_tier = t.value_tier and t1.id <> t.id
)
group by value_tier
在DataFrameAPI中,使用groupBy和agg以及collect_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()