Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据pyspark dataframe中另一列的值计数聚合一列_Sql_Dataframe_Pyspark_Hive - Fatal编程技术网

Sql 根据pyspark dataframe中另一列的值计数聚合一列

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,

我想对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,因为它出现在两个价值层中

    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()