Незважаючи на те, що це можна використовувати INSERT OVERWRITE
для виведення даних з вулика, це може бути не найкращим методом для вашого конкретного випадку. Спочатку дозвольте пояснити, що 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;
Сподіваюся, що це допомагає.