Подтвердить что ты не робот

Как экспортировать таблицу Hive в файл CSV?

Я использовал этот запрос Hive для экспорта таблицы в файл CSV.

INSERT OVERWRITE DIRECTORY '/user/data/output/test' select column1, column2 from table1;

Файл сгенерированный '000000_0' не имеет разделителя запятой

Правильно ли это файл CSV? Если нет, сообщите мне, как я могу сгенерировать CSV файл?

4b9b3361

Ответ 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