Как экспортировать таблицу Hive в файл CSV?
Я использовал этот запрос Hive для экспорта таблицы в файл CSV.
INSERT OVERWRITE DIRECTORY '/user/data/output/test' select column1, column2 from table1;
Файл сгенерированный '000000_0' не имеет разделителя запятой
Правильно ли это файл CSV? Если нет, сообщите мне, как я могу сгенерировать CSV файл?
Ответы
Ответ 1
или используйте этот
hive -e 'select * from your_Table' | sed 's/[\t]/,/g' > /home/yourfile.csv
Вы также можете указать свойство set hive.cli.print.header=true
перед SELECT
, чтобы гарантировать, что заголовок вместе с данными будет создан и скопирован в файл.
Например:
hive -e 'set hive.cli.print.header=true; select * from your_Table' | sed 's/[\t]/,/g' > /home/yourfile.csv
Если вы не хотите писать в локальную файловую систему, завершите вывод команды sed
обратно в HDFS
с помощью команды hadoop fs -put
.
Ответ 2
Если вы используете Hive 11 или лучше, вы можете использовать оператор INSERT
с ключевым словом LOCAL
.
Пример:
insert overwrite local directory '/home/carter/staging' row format delimited fields terminated by ',' select * from hugetable;
Обратите внимание, что это может создать несколько файлов, и вы можете захотеть их конкатенировать на стороне клиента после его экспорта.
Использование этого подхода означает, что вам не нужно беспокоиться о формате исходных таблиц, экспортировать на основе произвольного SQL-запроса и выбирать собственные разделители и выходные форматы.
Ответ 3
Это должно работать для вас
-
вкладка разделена
hive -e 'select * from some_table' > /home/yourfile.tsv
-
разделенные запятыми
hive -e 'select * from some_table' | sed 's/[\t]/,/g' > /home/yourfile.csv
Ответ 4
У вас не может быть разделителя для вывода запроса после создания отчета (как и вы).
вы можете изменить разделитель на запятую.
Он поставляется с разделителем по умолчанию \001
(неотъемлемый символ).
hadoop fs -cat /user/data/output/test/* |tr "\01" "," >>outputwithcomma.csv
проверьте это также
Ответ 5
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select * from table;
- правильный ответ.
Если количество записей действительно велико, в зависимости от количества созданных файлов
следующая команда даст только частичный результат.
hive -e 'select * from some_table' > /home/yourfile.csv
Ответ 6
Последние версии улей поставляются с этой функцией.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
select * from table;
таким образом вы можете выбрать свой собственный разделитель и имя файла.
Просто будьте осторожны с " OVERWRITE", он попытается удалить все из указанной папки.
Ответ 7
Я использовал простой linux shell piping + perl для преобразования генерируемого сгенерированного вывода из tsv в csv.
hive -e "SELECT col1, col2, … FROM table_name" | perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\t/","/g' > output_file.csv
(я получил обновленное регулярное выражение perl от кого-то в stackoverflow некоторое время назад)
Результат будет похож на обычный csv:
"col1","col2","col3"
... и т.д.
Ответ 8
Следующий скрипт должен работать на вас:
#!/bin/bash
hive -e "insert overwrite local directory '/LocalPath/'
row format delimited fields terminated by ','
select * from Mydatabase,Mytable limit 100"
cat /LocalPath/* > /LocalPath/table.csv
Я использовал limit 100
чтобы ограничить размер данных, поскольку у меня была огромная таблица, но вы можете удалить ее, чтобы экспортировать всю таблицу.
Ответ 9
Здесь, используя хранилище хранилища Hive, вы можете экспортировать данные вместо таблицы Hive.
сначала укажите путь хранилища улья и после локального пути, где вы хотите сохранить CSV файл
Для этой команды ниже: -
hadoop fs -cat /user/hdusr/warehouse/HiveDb/tableName/* > /users/hadoop/test/nilesh/sample.csv
Ответ 10
У меня была аналогичная проблема, и именно так я смог ее решить.
Шаг 1 - Загрузите данные из таблицы улей в другую таблицу следующим образом
ТАБЛИЦА DROP IF EXISTS TestHiveTableCSV; CREATE TABLE TestHiveTableCSV ROW FORMAT DELIMITED FIELDS TERMINATED BY, 'LINES TERMINATED by'\n 'AS SELECT Список столбцов FROM TestHiveTable;
Шаг 2 - Скопирован блок с хранилища улья в новое место с соответствующим расширением
Start-AzureStorageBlobCopy
-DestContext $destContext
-SrcContainer "Контейнер источника"
-SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Контейнер назначения" ` -DestBlob "CSV/TestHiveTable.csv"
Надеюсь, это поможет!
С наилучшими пожеланиями,
Даттатри Синдол (Датта)
http://dattatreysindol.com
Ответ 11
Есть способы изменить разделитель по умолчанию, как показано другими ответами.
Также есть способы конвертировать исходный вывод в csv с помощью некоторых скриптов bash. Есть 3 ограничителя, которые следует учитывать, а не только \001. Все становится немного сложнее, если в таблице hive есть maps.
Я написал bash script, который может обрабатывать все 3 разделителя по умолчанию (\ 001\002 и \003) из куста и выводить csv. script и некоторые дополнительные сведения находятся здесь:
Удерживать по умолчанию разделители по умолчанию в CSV
Ограничения по умолчанию для улья
Row Delimiter => Control-A ('\001')
Collection Item Delimiter => Control-B ('\002')
Map Key Delimiter => Control-C ('\003')
Есть способы изменить эти разделители при экспорте таблиц, но иногда вам все равно может потребоваться преобразовать это в csv.
Вот быстрый bash script, который может обрабатывать экспорт DB, который сегментируется в нескольких файлах и имеет разделители по умолчанию. Это будет выводит один CSV файл.
Предполагается, что все сегменты имеют соглашение об именах 000 * _0
INDIRECTORY="path/to/input/directory"
for f in $INDIRECTORY/000*_0; do
echo "Processing $f file..";
cat -v $f |
LC_ALL=C sed -e "s/^/\"/g" |
LC_ALL=C sed -e "s/\^A/\",\"/g" |
LC_ALL=C sed -e "s/\^C\^B/\"\":\"\"\"\",\"\"/g" |
LC_ALL=C sed -e "s/\^B/\"\",\"\"/g" |
LC_ALL=C sed -e "s/\^C/\"\":\"\"/g" |
LC_ALL=C sed -e "s/$/\"/g" > $f-temp
done
echo "you,can,echo,your,header,here,if,you,like" > $INDIRECTORY/final_output.csv
cat $INDIRECTORY/*-temp >> $INDIRECTORY/final_output.csv
rm $INDIRECTORY/*-temp
Больше объяснений на сути
Ответ 12
Если вы делаете это из Windows, вы можете использовать скрипт Python Hivehoney, чтобы извлечь данные таблицы в локальный файл CSV.
Будет:
- Авторизуйтесь на бастионном хосте.
- pbrun.
- Kinit.
- Билайн (по вашему запросу).
- Сохранить эхо от билайна в файл на винде.
Выполните это так:
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
Ответ 13
Решения проблем в порядке, но я нашел некоторые проблемы в обоих:
-
Как сказал Картер Шанклин, с помощью этой команды мы получим CSV файл с результатами запроса по указанному пути:
insert overwrite local directory '/home/carter/staging' row format delimited fields terminated by ',' select * from hugetable;
Проблема с этим решением состоит в том, что полученный CSV не будет иметь заголовков и создаст файл, который не является CSV (поэтому мы должны переименовать его).
-
Как сказал пользователь 1922900, с помощью следующей команды мы получим файлы CSV с результатами запроса в указанном файле и с заголовками:
hive -e 'select * from some_table' | sed 's/[\t]/,/g' > /home/yourfile.csv
С помощью этого решения мы получим файл CSV с результирующими строками нашего запроса, но с сообщениями журнала между этими строками. В качестве решения этой проблемы я попробовал это, но безрезультатно.
Итак, чтобы решить все эти проблемы, я создал скрипт, который выполняет список запросов, создает папку (с отметкой времени), в которой хранятся результаты, переименовывает полученные файлы, удаляет ненужные файлы, а также добавляет соответствующие заголовки.
#!/bin/sh
QUERIES=("select * from table1" "select * from table2")
IFS=""
directoryname=$(echo "ScriptResults$timestamp")
mkdir $directoryname
counter=1
for query in ${QUERIES[*]}
do
tablename="query"$counter
hive -S -e "INSERT OVERWRITE LOCAL DIRECTORY '/data/2/DOMAIN_USERS/SANUK/users/$USER/$tablename' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' $query ;"
hive -S -e "set hive.cli.print.header=true; $query limit 1" | head -1 | sed 's/[\t]/,/g' >> /data/2/DOMAIN_USERS/SANUK/users/$USER/$tablename/header.csv
mv $tablename/000000_0 $tablename/$tablename.csv
cat $tablename/$tablename.csv >> $tablename/header.csv.
rm $tablename/$tablename.csv
mv $tablename/header.csv $tablename/$tablename.csv
mv $tablename/$tablename.csv $directoryname
counter=$((counter+1))
rm -rf $tablename/
done
Ответ 14
Ниже представлено комплексное решение, которое я использую для экспорта данных таблицы Hive в HDFS в виде отдельного файла CSV с заголовком.
(к сожалению, это невозможно сделать с одним оператором HQL)
Он состоит из нескольких команд, но, на мой взгляд, он довольно интуитивно понятен и не зависит от внутреннего представления таблиц Hive, которое может время от времени меняться.
Замените "DIRECTORY" на "LOCAL DIRECTORY", если вы хотите экспортировать данные в локальную файловую систему вместо HDFS.
# cleanup the existing target HDFS directory, if it exists
sudo -u hdfs hdfs dfs -rm -f -r /tmp/data/my_exported_table_name/*
# export the data using Beeline CLI (it will create a data file with a surrogate name in the target HDFS directory)
beeline -u jdbc:hive2://my_hostname:10000 -n hive -e "INSERT OVERWRITE DIRECTORY '/tmp/data/my_exported_table_name' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM my_exported_table_name"
# set the owner of the target HDFS directory to whatever UID you'll be using to run the subsequent commands (root in this case)
sudo -u hdfs hdfs dfs -chown -R root:hdfs /tmp/data/my_exported_table_name
# write the CSV header record to a separate file (make sure that its name is higher in the sort order than for the data file in the target HDFS directory)
# also, obviously, make sure that the number and the order of fields is the same as in the data file
echo 'field_name_1,field_name_2,field_name_3,field_name_4,field_name_5' | hadoop fs -put - /tmp/data/my_exported_table_name/.header.csv
# concatenate all (2) files in the target HDFS directory into the final CSV data file with a header
# (this is where the sort order of the file names is important)
hadoop fs -cat /tmp/data/my_exported_table_name/* | hadoop fs -put - /tmp/data/my_exported_table_name/my_exported_table_name.csv
# give the permissions for the exported data to other users as necessary
sudo -u hdfs hdfs dfs -chmod -R 777 /tmp/data/hive_extr/drivers