SPARK SQL分组集

时间:2017-10-18 12:37:25

标签: sql apache-spark spark-dataframe

我需要将各种列集合组合作为参数

传递给我的sql查询

例如:

Val result=sqlContext.sql(""" select col1,col2,col3,col4,col5,count(col6) from table T1 GROUP BY col1,col2,col3,col4,col5 GROUPING SETS ((col1,col2),(col3,col4),(col4, col5)) """)

有几种组合我需要找到聚合值。 有没有办法将这些列的列作为参数传递给SQL查询,而不是手动硬编码。

目前我已在sql查询中提供了所有组合,但如果再次出现任何新组合,我将需要更改查询。我打算将所有组合放在一个文件中,然后读取all并将其作为参数传递给sql查询。有可能吗?

示例:表

id category age gender cust_id

1   101 54  M   1111
1   101 54  M   2222
1   101 55  M   3333
1   102 55     F    4444

""" select id, category, age, gender, count(cust_id) from table T1 group By id, category, age, gender
GROUPING SETS ((id,category),(id,age),(id,gender)) """

它应该产生以下结果:

group by (id, category) - count of cust_id 
1 101 3
1 102 1
group by (id and age) - count of cust_id
1 54 2
1 55 2
group by (id and gender) - count cust_id
1 M 3
1 F 1

这只是一个例子 - 我需要将各种不同的组合传递给GROPING SETS(并非所有组合),与参数一样或单独传递

任何帮助都会非常感激。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以动态构建SQL

// original slices
var slices = List("(col1, col2)", "(col3, col4)", "(col4, col5)")
// adding new slice
slices = "(col1, col5)" :: slices 
// building SQL dynamically
val q =
s"""
with t1 as
(select 1 col1, 2 col2, 3 col3,
        4 col4, 5 col5, 6 col6)
select col1,col2,col3,col4,col5,count(col6)
  from t1
group by col1,col2,col3,col4,col5
grouping sets ${slices.mkString("(", ",", ")")}
"""
// output
spark.sql(q).show

结果

scala> spark.sql(q).show
+----+----+----+----+----+-----------+
|col1|col2|col3|col4|col5|count(col6)|
+----+----+----+----+----+-----------+
|   1|null|null|null|   5|          1|
|   1|   2|null|null|null|          1|
|null|null|   3|   4|null|          1|
|null|null|null|   4|   5|          1|
+----+----+----+----+----+-----------+

答案 1 :(得分:0)

  

将列集与我的sql查询组合为参数

sql由Spark not source database执行。它根本无法到达MySQL。

  

我提供了所有组合

如果您想要所有可能的组合,则不需要GROUPING SETS。只需使用CUBE

SELECT ... FROM table CUBE (col1,col2,col3,col4,col5)