Подтвердить что ты не робот

Динамически связывать переменную/параметр в Spark SQL?

Как связать переменную в Apache Spark SQL? Например:

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
4b9b3361

Ответ 1

Spark SQL (начиная с версии 1.6) не поддерживает переменные связывания.

пс. То, что предлагает Ашрит, не является переменной связывания. Вы создаете строку каждый раз. Каждое время Spark проанализирует запрос, создаст план выполнения и т.д. Цель переменных связывания (например, в системах RDBMS) - сократить время на создание плана выполнения (что может быть дорогостоящим при большом количестве соединений и т.д.). У Spark должен быть специальный API для "разбора" запроса, а затем для "связывания" переменных. Spark не имеет этой функциональности (на сегодня выпуск Spark 1.6).

Обновление 8/2018: начиная с Spark 2.3 в Spark (до сих пор) нет переменных связывания.

Ответ 2

Я проверил это как в Spark shell 2.x, так и в Thrift (билайн). Я мог связать переменную в SQL-запросе Spark с помощью команды set.

Запрос без переменной привязки:

select count(1) from mytable;

Запрос с переменной связывания (параметризованный):

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

Оба w/w.o связывают параметры, запрос возвращает идентичный результат.

Примечание. Не используйте кавычки для значения ключа в качестве имени таблицы здесь.

Дайте мне знать, если есть какие-либо вопросы.

Ответ 3

Вы смотрите на передачу переменной из с в той же программе/оболочке, если это так:

val VAL1 = "testcol"
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
sqlContext.sql(s"SELECT * FROM src WHERE col1 = $VAL1").collect().foreach(println)

Ответ 4

Pyspark

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

Ответ 5

Попробуйте эти

sqlContext.sql(s"SELECT * FROM src WHERE col1 = '${VAL1}'").collect().foreach(println)