В чем разница Hive таблиц и external tables?
Что проверяют
Понимаете ли вы, кто владеет данными: Hive или кто-то снаружи, и что из этого следует для DROP, загрузки новых файлов и совместной работы со Spark. Следом обычно спрашивают, почему после загрузки файлов запрос их не видит.
Как отвечать
Корректная пара терминов: managed (внутренняя) и external (внешняя) таблица. Обе хранят метаданные в Hive Metastore, разница в судьбе самих файлов:
- managed: Hive владеет и метаданными, и файлами. Данные по умолчанию лежат в каталоге хранилища (
hive.metastore.warehouse.dir),DROP TABLEудаляет и описание, и файлы; - external: создаётся через
CREATE EXTERNAL TABLE ... LOCATION '...', файлы принадлежат внешнему процессу.DROP TABLEудаляет только метаданные, файлы остаются.TRUNCATEна внешней таблице Hive по умолчанию не выполнит; - Hive 3 и новее: managed-таблицы по умолчанию транзакционные (ACID), полноценно в формате ORC, с поддержкой
UPDATEиDELETE. Внешние таблицы транзакционными не делаются; - проверка типа:
DESCRIBE FORMATTED tпокажетMANAGED_TABLEилиEXTERNAL_TABLE.
Когда что брать. Внешние подходят для сырого слоя, куда файлы кладёт загрузчик и откуда их читают Spark, Trino и другие инструменты. Managed подходят для производных таблиц и витрин, жизненным циклом которых управляет сам Hive.
Про скорость скажите прямо: сам тип таблицы запросы не ускоряет. Скорость определяют формат (ORC, Parquet), партиционирование и статистика (ANALYZE TABLE ... COMPUTE STATISTICS).
Где спотыкаются
Удаляют managed-таблицу, на файлы которой рассчитывал другой процесс, и теряют данные. Прежде чем удалять чужую таблицу, стоит проверить её тип.
Кладут новые партиции во внешнюю таблицу файлами и не понимают, почему SELECT их не видит. Metastore о них не знает, нужен MSCK REPAIR TABLE или ALTER TABLE ... ADD PARTITION.
Думают, что external значит «данные вне HDFS». Внешняя таблица может лежать и в HDFS, и в S3, слово описывает владение, а не место хранения.