#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. Спасибо, что помогли сделать это лучшим ответом, я ценю это.