Как связать переменную в Apache Spark SQL? Например:
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
Как связать переменную в Apache Spark SQL? Например:
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
Spark SQL (начиная с версии 1.6) не поддерживает переменные связывания.
пс. То, что предлагает Ашрит, не является переменной связывания. Вы создаете строку каждый раз. Каждое время Spark проанализирует запрос, создаст план выполнения и т.д. Цель переменных связывания (например, в системах RDBMS) - сократить время на создание плана выполнения (что может быть дорогостоящим при большом количестве соединений и т.д.). У Spark должен быть специальный API для "разбора" запроса, а затем для "связывания" переменных. Spark не имеет этой функциональности (на сегодня выпуск Spark 1.6).
Обновление 8/2018: начиная с Spark 2.3 в Spark (до сих пор) нет переменных связывания.
Я проверил это как в 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 связывают параметры, запрос возвращает идентичный результат.
Примечание. Не используйте кавычки для значения ключа в качестве имени таблицы здесь.
Дайте мне знать, если есть какие-либо вопросы.
Вы смотрите на передачу переменной из с в той же программе/оболочке, если это так:
val VAL1 = "testcol"
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
sqlContext.sql(s"SELECT * FROM src WHERE col1 = $VAL1").collect().foreach(println)
Pyspark
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)
Попробуйте эти
sqlContext.sql(s"SELECT * FROM src WHERE col1 = '${VAL1}'").collect().foreach(println)