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

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

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

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

Спасибо!

Ответ 1

Хотя для получения данных из Hive можно использовать INSERT OVERWRITE, это может быть не лучший метод для вашего конкретного случая. Сначала позвольте мне объяснить, что делает INSERT OVERWRITE, тогда я опишу метод, который я использую для получения tsv файлов из таблиц Hive.

В соответствии с руководство ваш запрос будет хранить данные в каталоге в HDFS. Формат не будет csv.

Данные, записанные в файловую систему, сериализуются как текст с столбцами, разделенными ^ A и строками, разделенными символами новой строки. Если какой-либо из столбцов не имеет примитивного типа, то эти столбцы сериализуются в формате JSON.

Небольшая модификация (добавление ключевого слова LOCAL) будет хранить данные в локальном каталоге.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;

Когда я запускаю аналогичный запрос, вот как выглядит вывод.

[[email protected] temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug  9 09:21 000000_0
[[email protected] 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;

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

для ex:

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

Ответ 6

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

Чтобы сделать данные столбца tsv безопасными, я заменил все символы \t chars в данных столбца пробелом и выполнил код 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. Надеюсь, это поможет тем, кто ищет это решение.

Ответ 7

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

Шаг 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. Скопирован blob из хранилища Hive в новое место с соответствующим расширением

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

Ответ 8

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

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

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

Ответ 9

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

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

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

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

Ответ 10

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

Ответ 11

Если вы делаете это из Windows, вы можете использовать скрипт Python Hivehoney, чтобы извлечь данные таблицы в локальный файл CSV.

Будет:

  1. Вход в бастионный хост.
  2. pbrun.
  3. Kinit.
  4. Билайн (по вашему запросу).
  5. Сохранить эхо от билайна в файл на винде.

Выполните это так:

set PROXY_HOST=your_bastion_host

set SERVICE_USER=you_func_user

set LINUX_USER=your_SOID

set LINUX_PWD=your_pwd

python hh.py --query_file=query.sql

Ответ 12

Я пробовал разные варианты, но это было бы одним из самых простых решений для Python Pandas:

hive -e 'select books from table' | grep "|" ' > temp.csv

df=pd.read_csv("temp.csv",sep='|')

Вы также можете использовать tr "|" "," tr "|" "," конвертировать "|" к ","

Ответ 13

Просто для того, чтобы выполнить следующие шаги после запуска запроса: INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;

В моем случае сгенерированные данные в папке temp находятся в формате deflate и выглядят так:

$ ls
000000_0.deflate  
000001_0.deflate  
000002_0.deflate  
000003_0.deflate  
000004_0.deflate  
000005_0.deflate  
000006_0.deflate  
000007_0.deflate

Вот команда, чтобы разархивировать файлы deflate и поместить все в один CSV файл:

hadoop fs -text "file:///home/lvermeer/temp/*" > /home/lvermeer/result.csv

Ответ 14

hive  --outputformat=csv2 -e "select * from yourtable" > my_file.csv

или же

hive  --outputformat=csv2 -e "select * from yourtable" > [your_path]/file_name.csv

Для tsv просто измените csv на tsv в приведенных выше запросах и выполните ваши запросы

Ответ 15

Я могу опоздать на этот, но помог бы с ответом:

echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv hive -e 'выбрать отдельный concat (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) из аргумента table_Name где, если требуется; ' >> SAMPLE_Data.csv

Ответ 16

Эта команда оболочки печатает выходной формат в csv в output.txt без заголовков столбцов.

$ hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf hive.cli.print.header=false > output.txt

Ответ 17

Это наиболее удобный для csv способ вывода результатов HiveQL.
Вам не нужны никакие команды grep или sed для форматирования данных, вместо этого hive поддерживает их, просто нужно добавить дополнительный тег outputformat.

hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv