Comment lier une variable dans Apache Spark SQL? Par exemple:
val sqlContext = new org.Apache.spark.sql.Hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
Spark SQL (à partir de la version 1.6) ne prend pas en charge les variables de liaison.
ps. Ce que suggère Ashrith n'est pas une variable de liaison. Vous construisez une chaîne à chaque fois. Evey time Spark analysera la requête, créera un plan d'exécution, etc. Le but des variables de liaison (dans les systèmes SGBDR, par exemple) est de gagner du temps lors de la création du plan d'exécution (ce qui peut être coûteux lorsqu'il y a beaucoup de jointures, etc.). Spark doit avoir une API spéciale pour "analyser" une requête, puis pour "lier" les variables. Spark ne dispose pas de cette fonctionnalité (à ce jour, version Spark 1.6).
Mise à jour 8/2018 : à partir de Spark 2.3, il n'y a (toujours) aucune variable de liaison dans Spark.
Je l'ai vérifié dans/ Spark Shell 2.x Shell et Thrift (beeline) aussi. J'ai pu lier une variable dans une requête Spark SQL avec la commande set
.
Requête sans variable de liaison:
select count(1) from mytable;
Requête avec variable d'association (paramétrée):
1. Spark SQL Shell
set key_tbl=mytable; -- setting mytable to key_tbl to use as ${key_tbl} select count(1) from ${key_tbl};
2. Spark Shell
spark.sql("set key_tbl=mytable") spark.sql("select count(1) from ${key_tbl}").collect()
Les deux paramètres de liaison w/w.o, la requête renvoie un résultat identique.
Note: Ne donnez pas de guillemets à la valeur de key car c'est son nom de table ici.
Faites-moi savoir s'il y a des questions.
Pyspark
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)