Мы обновили нашу платформу 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]?
Надеюсь, что это ясно, пожалуйста, дайте мне знать, если вам нужна другая информация!
Спасибо, если поможете или подскажете!
hive.metastore.limit.partition.request
? - person Piyush Patel   schedule 04.06.2020