web-dev-qa-db-fra.com

lier dynamiquement variable/paramètre dans Spark SQL?

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)
11
user3769729

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.

8
Tagar

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.

6
mrsrinivas

Pyspark 

sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)
0
Vijay Krishna