Я работаю с большим набором данных, который разбивается на два столбца - plant_name
и tag_id
. Второй раздел - tag_id
имеет 200000 уникальных значений, и я в основном получаю доступ к данным по определенным значениям tag_id
. Если я использую следующие команды Spark:
sqlContext.setConf("spark.sql.hive.metastorePartitionPruning", "true")
sqlContext.setConf("spark.sql.parquet.filterPushdown", "true")
val df = sqlContext.sql("select * from tag_data where plant_name='PLANT01' and tag_id='1000'")
Я бы ожидал быстрого ответа, так как это разрешает один раздел. В Hive и Presto это занимает несколько секунд, однако Spark работает в течение нескольких часов.
Фактические данные хранятся в ведре S3, и когда я отправляю запрос sql, Spark отключается и сначала получает все разделы из метастара Hive (200000 из них), а затем вызывает refresh()
, чтобы принудительно выполнить полный список всех этих файлов в хранилище объектов S3 (фактически вызывающий listLeafFilesInParallel
).
Эти две операции настолько дороги, есть ли какие-либо настройки, которые могут заставить Spark обрезать разделы раньше - либо во время вызова в хранилище метаданных, либо сразу после этого?