Spark + Hive: количество просканированных разделов превышает предел (= 4000)

Мы обновили нашу платформу Hadoop (Spark; 2.3.0, Hive: 3.1), и я столкнулся с этим исключением при чтении некоторых таблиц Hive в Spark: «Число отсканированных разделов в таблице my_table превышает предел (= 4000)».

Таблицы, над которыми мы работаем :
таблица1 : внешняя таблица с общим количеством разделов ~12300, разделенных (col1: String, date1: String) , (сжатый ORC ZLIB)
таблица2 : внешняя таблица с общим количеством 4585 разделов разделы, разделенные (col21: String, date2: Date, col22: String) (несжатый ORC)

[A] Зная, что мы установили эту конфигурацию spark:
--conf "spark.hadoop.metastore.catalog.default=hive"
Выполняем в spark:
[1] spark.sql("select * from table1 where col1 = 'value1' and date1 = '2020-06-03'").count
=> Ошибка: количество просканированных разделов ( =12300) в таблице table1 превышает лимит (=4000)
[2] spark.sql("select * from table2 where col21 = 'value21' and col22 = 'value22'").count
[3] spark.sql("select * from table2 where col21 = 'value21' and date2 = '2020-06-03' and col22 = 'value22'").count
=> Ошибка в [2] и [3]: количество просканированных разделов (=4585) ) в таблице 'table2' превышает лимит (=4000)

[B] Мы решили проблему, добавив этот spark conf:

--conf "spark.sql.hive.convertMetastoreOrc=false" 

в результате автоматически активируется: --conf "spark.sql.hive.metastorePartitionPruning=true"

Повторное выполнение в spark:
[1] и [2] => Успех
[3] => Ошибка: Number of partitions scanned (=4585) on table 'table2' exceeds limit (=4000)

[C] Чтобы устранить ошибку в [3], мы устанавливаем

--conf "spark.sql.hive.convertMetastoreOrc=false" 
--conf "spark.sql.hive.metastorePartitionPruning=false"

Повторное выполнение в spark :
[3] => Success
с другой стороны, если мы вспомним [1]: производительность снижается, выполнение занимает так много времени, и мы не хотим этого.

В заключение:
В случае [B] мы думаем, что раздел не может быть типа "Дата", когда это строка, это нормально.
Но почему? В чем дело ? Разве мы не должны иметь разделы других типов, кроме типа String, когда активировано сокращение раздела?
Почему это работает в случае [C]? и как мы могли бы решить случай [B][3] без ухудшения производительности [1]?

Надеюсь, что это ясно, пожалуйста, дайте мне знать, если вам нужна другая информация!

Спасибо, если поможете или подскажете!


person user2695912    schedule 03.06.2020    source источник
comment
Можете ли вы проверить значение конфигурации Hive для hive.metastore.limit.partition.request?   -  person Piyush Patel    schedule 04.06.2020
comment
Да, hive.metastore.limit.partition.request = 4000, и всегда было установлено значение 4000. Но проблема в том, что Spark сканирует все разделы таблицы, когда запрос на сканирование одного конкретного раздела...   -  person user2695912    schedule 04.06.2020
comment
какое разрешение для этого? spark сканирует все разделы для таблицы куста даже после указания одного единственного раздела   -  person Aviral Kumar    schedule 13.10.2020