Таблица Hive читается несколько раз при использовании spark.sql и union - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть одна таблица Hive, которая используется в нескольких последующих запросах spark.sql.

Каждый этап показывает HiveTableScan, который не является необходимым, так как таблицу нужно читать только один раз.

Как этого избежать?

Вот упрощенный пример, которыйповторяет проблему

Создайте пример таблицы: -

spark.sql("CREATE DATABASE IF NOT EXISTS default")
spark.sql("DROP TABLE IF EXISTS default.data")
spark.sql("CREATE TABLE IF NOT EXISTS default.data(value INT)")
spark.sql("INSERT OVERWRITE TABLE default.data VALUES(1)")

Выполните несколько запросов, основанных на предыдущем кадре данных: -

query1 = spark.sql("select value from default.data")
query1.createOrReplaceTempView("query1")

query2 = spark.sql("select max(value)+1 as value from query1").union(query1)
query2.createOrReplaceTempView("query2")

query3 = spark.sql("select max(value)+1 as value from query2").union(query2)
query3.createOrReplaceTempView("query3")

spark.sql("select value from query3").show()

Ожидаемый результат: -

|value|
+-----+
|    3|
|    2|
|    1|
+-----+

1 Ответ

1 голос
/ 23 апреля 2019

РЕДАКТИРОВАНИЕ

Вы можете использовать cacheTable (String tableName)?

попробуйте это:

query1 = spark.sql("select value from default.data")
query1.createOrReplaceTempView("query1")

spark.sqlContext().cacheTable("query1")

query2 = spark.sql("select max(value)+1 as value from query1").union(query1)
query2.createOrReplaceTempView("query2")

spark.sqlContext().cacheTable("query2")

query3 = spark.sql("select max(value)+1 as value from query2").union(query2)
query3.createOrReplaceTempView("query3")

spark.sqlContext().cacheTable("query3")

spark.sql("select value from query3").show()

Используя эту функцию, Spark-Sql будет кэшировать ваши таблицы, используя формат столбцов в памяти, чтобы минимизировать использование памяти.Затем вы можете разархивировать таблицы, используя uncacheTable () , как показано ниже:

spark.sqlContext().uncacheTable("query1");
spark.sqlContext().uncacheTable("query2");
spark.sqlContext().uncacheTable("query3");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...