У меня есть секционированная таблица tab
, и я хочу создать из нее некоторую таблицу tmp test1
. Вот как я создал таблицу tmp:
CREATE TABLE IF NOT EXISTS test1
(
COL1 string,
COL2 string,
COL3 string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;
Написать в эту таблицу:
INSERT OVERWRITE TABLE test1
SELECT TAB.COL1 as COL1,
TAB.COL2 as COL2,
TAB.COL3 as COL3
FROM TAB
WHERE PT='2019-05-01';
Затем я подсчитываю записи в test1, у него 94493486 записей, в то время как следующий SQL возвращает счет 149248486:
SELECT COUNT(*) FROM
(SELECT TAB.COL1 as COL1,
TAB.COL2 as COL2,
TAB.COL3 as COL3
FROM TAB
WHERE PT='2019-05-01') AS TMP;
Кроме того, когда я сохраняю выбранный раздел (PT - это столбец раздела) в HDFS, количество записей корректно:
INSERT OVERWRITE directory '/user/me/wtfhive' row format delimited fields terminated by '|'
SELECT TAB.COL1 as COL1,
TAB.COL2 as COL2,
TAB.COL3 as COL3
FROM TAB
WHERE PT='2019-05-01';
Моя версия Hive 3.1.0 поставляется с Ambari 2.7.1.0. Кто-нибудь есть идеи, что может вызвать эту проблему? Спасибо.
=================== ОБНОВЛЕНИЕ =================
Я считаю, что что-то может быть связано с этой проблемой.
Таблица tab
использует ORC в качестве формата хранения. Его данные импортируются из файла данных ORC другой таблицы, в другом кластере Hive, с помощью следующего сценария:
LOAD DATA INPATH '/data/hive_dw/db/tablename/pt=2019-04-16' INTO TABLE tab PARTITION(pt='2019-04-16');
Поскольку таблица 2 имеет одинаковый формат, процедура загрузки в основном просто перемещает файл данных из исходного каталога HDFS в каталог Hive.
В следующей процедуре я могу загрузить без проблем:
- экспорт данных из таблицы ORC
tab
в текстовый файл HDFS
- загрузка из текстового файла в временную таблицу Hive
- загрузка данных обратно в
tab
из временной таблицы
- теперь я могу выбирать / экспортировать из
tab
в другие таблицы без пропусков записей
Я подозреваю, что проблема в формате ORC. Я просто не понимаю, почему он может без проблем экспортировать в текстовый файл HDFS, но экспорт в другую таблицу (независимо от того, какой формат хранения используется в другой таблице) приведет к потере данных.