Как вывести результаты запроса HiveQL в CSV?


мы хотели бы поместить результаты запроса Hive в файл CSV. Я думал, что команда должна выглядеть так:

insert overwrite directory '/home/output.csv' select books from table;

когда я запускаю его, он говорит, что он успешно завершен, но я никогда не могу найти файл. Как найти этот файл или я должен извлекать данные по-другому?

спасибо!

10 71

10 ответов:

хотя можно использовать 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;

надеюсь, что это поможет.

Если вы хотите файл CSV, то вы можете изменить решения Lukas следующим образом (предполагая, что вы находитесь на поле linux):

hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv

вы должны использовать инструкцию CREATE TABLE AS SELECT (CTAS) для создания каталога в HDFS с файлами, содержащими результаты запроса. После этого вам придется экспортировать файлы из HDFS в ваш обычный диск и объединить их в один файл.

вам также, возможно, придется сделать некоторые хитрости, чтобы конвертировать файлы из '\001' - delimited в CSV. Вы можете использовать пользовательский CSV SerDe или постпроцессор извлеченного файла.

Если вы используете оттенок это довольно просто, а также. Просто перейдите в Редактор Hive в HUE, выполните запрос hive, затем сохраните файл результата локально как XLS или CSV, или вы можете сохранить файл результата в HDFS.

Я искал аналогичное решение, но те, которые упомянуты здесь, не будут работать. Мои данные имели все варианты пробелов (пробел, новая строка, вкладка) символов и запятых.

чтобы сделать данные столбца tsv безопасными, Я заменил все символы \t в данных столбца пробелом и выполнил код python в командной строке для создания файла csv, как показано ниже:

hive -e 'tab_replaced_hql_query' |  python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")'

это создало совершенно допустимый csv. Надеюсь, это поможет тем, кто ищет это решение.

вы можете использовать функцию hive string CONCAT_WS( string delimiter, string str1, string str2...strn )

например:

hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv

можно использовать INSERT...DIRECTORY ..., как в этом примере:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';

OVERWRITE и LOCAL имеют те же интерпретации, что и раньше, и пути интерпретируются в соответствии с обычными правилами. Один или несколько файлов будут записаны в /tmp/ca_employees в зависимости от количества редукторов вызывается.

у меня была аналогичная проблема, и вот как я смог ее решить.

Шаг 1 - загружены данные из таблицы Hive в другую таблицу следующим образом

DROP TABLE IF EXISTS TestHiveTableCSV;
CREATE TABLE TestHiveTableCSV 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT Column List FROM TestHiveTable;

Шаг 2 - скопировал большой двоичный объект из хранилища Hive в новое место с соответствующим расширением

Start-AzureStorageBlobCopy
-DestContext $destContext 
-SrcContainer "Source Container"
-SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"

разделитель по умолчанию это "^A". На языке python это "\x01".

когда я хочу изменить разделитель, я использую SQL, как:

SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table

тогда считайте разделитель+"^A" как новый разделитель.

Как и ответ Рэя выше, Hive View 2.0 в Hortonworks Data Platform также позволяет запускать запрос Hive, а затем сохранять выходные данные в формате csv.