Impala / Hive предоставляет разделенные файлы parquet в виде таблицы

#hive #impala

#hive #impala

Вопрос:

Я использовал df.to_parquet(path="...", partition_cols="period") для записи фрейма данных в файлы parquet на HDFS (Cloudera CDH). Это работает нормально, создается структура вложенных папок ( period=YYYYMMDD ), и когда я читаю отдельные файлы parquet, они содержат ожидаемые данные (как и ожидалось, они не содержат period столбец, поскольку он был выделен). Сейчас я пытаюсь создать таблицу, используя Impala / Hive.

 CREATE EXTERNAL TABLE lab.tablename
LIKE PARQUET '/data/.../db/tablename/period=20200101/dhfjksdhdsakjdhjk.parquet'
PARTITIONED BY (period INT)
STORED AS PARQUET
LOCATION '/data/.../db/tablename'
 

Сначала кажется, что это работает. Таблица отображается в базе данных, столбцы перечислены правильно,
period ключ даже указан как ключ раздела. Однако

 select * from lab.tablename
>>  Done. 0 results.
 

Кажется, что каким-то образом Impala неправильно устанавливает ссылки. Я также пытался:

 COMPUTE STATS lab.tablename
>> Updated 0 partition(s) and 2 column(s).
 

и получает 0 строк при проверке

 SHOW TABLE STATS lab.tablename
 

Если я записываю одни и те же данные без разделения, это работает нормально.

Ответ №1:

Hive не знает о разделах в метасторе, даже если вы использовали правильную папку. используйте:

 MSCK REPAIR TABLE lab.tablename
 

И он должен обнаружить отсутствующие разделы и добавить их в хранилище метафор.

Impala: запустите эту команду, чтобы она приняла изменения:

 INVALIDATE METADATA lab.tablename
 

Хорошее чтение, если вы хотите получить более подробное объяснение.

Комментарии:

1. удивительно! Используя редактор запросов Hive, теперь я могу успешно запустить свой select (после запуска msck repair). Но в Impala я все равно получаю нулевые результаты. Я очистил кеш и т. Д., Но, возможно, это займет некоторое время?

2. хорошо, нужно просто запустить INVALIDATE METADATA lab.tablename в Impala, чтобы заставить его работать там. Мэтт, можете ли вы добавить это в свой ответ на я могу это принять?

3. Спасибо, что помогли сделать это лучшим ответом, я ценю это.