Хотя его можно использовать INSERT OVERWRITE
для получения данных из Hive, это может быть не лучший метод для вашего конкретного случая. Сначала позвольте мне объяснить, что INSERT OVERWRITE
это такое, а затем я опишу метод, который я использую для получения файлов tsv из таблиц Hive.
Согласно руководству , ваш запрос сохранит данные в каталоге в HDFS. Формат не будет csv.
Данные, записанные в файловую систему, сериализуются в виде текста со столбцами, разделенными символом ^ A, и строками, разделенными символами новой строки. Если какой-либо из столбцов не является примитивным типом, эти столбцы сериализуются в формат JSON.
Небольшая модификация (добавление LOCAL
ключевого слова) сохранит данные в локальном каталоге.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
Когда я запускаю аналогичный запрос, вот как выглядит результат.
[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug 9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE
Лично я обычно запускаю свой запрос напрямую через Hive в командной строке для такого рода вещей и перенаправляю его в локальный файл следующим образом:
hive -e 'select books from table' > /home/lvermeer/temp.tsv
Это дает мне файл с разделителями табуляции, который я могу использовать. Надеюсь, это будет полезно и для вас.
Основываясь на этом патче 3682 , я подозреваю, что при использовании Hive 0.11 доступно лучшее решение, но я не могу проверить это сам. Новый синтаксис должен позволять следующее.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
select books from table;
Надеюсь, это поможет.