2017-10-18 7 views
0

J'ai besoin de passer diverses combinaisons d'ensembles de colonnes à ma requête SQL en tant que paramètreGROUPEMENT SPARK SQL ENSEMBLES

par exemple:

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

Il y a plusieurs combinaison dont je dois trouver la valeur agrégée. Est-il possible de passer ces ensembles de colonnes en tant que paramètre à la requête SQL au lieu de le coder manuellement.

Actuellement, j'ai fourni toute la combinaison en requête SQL, mais si une nouvelle combinaison vient à nouveau, je devrais changer la requête. Je prévois d'avoir toute la combinaison dans un fichier, puis lire tout et passer en paramètre à sql query. C'est possible?

Exemple: Tableau

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

devrait produire en dessous de résultat:

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 

c'est juste un exemple - je dois passer diverses combinaisons différentes de ENSEMBLES tâtonnant (pas tous combinés) De même que paramètre en une fois OU séparément

Toute aide serait vraiment appréciée.

Merci beaucoup.

+0

pouvez-vous partager une petite données d'exemple et les résultats attendus? – mtoto

+0

Salut, j'ai ajouté l'exemple. n'importe quelle aide serait vraiment appréciée –

Répondre

0

combinaison de la colonne fixe à ma requête SQL en tant que paramètre

sql est exécuté par Spark pas de base de données source. Il n'atteindra pas MySQL du tout.

J'ai fourni toute la combinaison

Vous n'avez pas besoin GROUPING SETS si vous voulez toutes les combinaisons possibles. Il suffit d'utiliser CUBE:

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

Mon sql signifie - ma requête d'étincelle SQL et je dois faire l'agrégation sur différents ensembles de colonnes pas toutes les colonnes. Auparavant, j'ai essayé CUBE pour obtenir toutes les combinaisons, mais cela prend très longtemps et le code échoue et il produit également toutes les combinaisons qui ne sont pas nécessaires pour mon cas. –

1

Vous pouvez construire SQL dynamique

// 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 

Résultat

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| 
+----+----+----+----+----+-----------+