2015-05-13 4 views
9

Я знаю, что существует известная проблема с разделителями при сохранении таблицы в csv (или другом текстовом файле) в Hive. Поэтому мне интересно, если вы, ребята, поможете мне обойти это.Экспорт таблицы hive в csv в hdfs

У меня есть существующая таблица (таблица A), и я хотел бы сохранить ее в формате csv в hdfs. Из чтения других ответов я считаю, что мне придется сначала создать внешнюю таблицу (но я не уверен, как все это будет выглядеть).

Может ли кто-нибудь помочь?

+0

Лично я просто использовал 'insert overwrite directory' и имел файл с разделителем' \ 001'. Но если вы * должны иметь csv, я думаю, что вам лучше всего передать запрос локальному .csv, а затем 'hadoop fs -put'-ing в hdfs, который описан здесь http://stackoverflow.com/questions/18129581/how-do-i-output-the-results-of-a-hiveql-query-to-csv – gobrewers14

+0

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

+0

Я загружаю данные из hdfs в искровую строку и указываю разделитель как '' \ 001 "'. У меня никогда не было (причины) импортировать файл из HDFS в R, но я предполагаю, что он может использовать любой разделитель, если он указан правильно. – gobrewers14

ответ

9

Попробуйте это в улей оболочки:

INSERT OVERWRITE LOCAL DIRECTORY '/path/to/hive/csv' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM hivetablename; 

Измените ваш /path/to/csv в том месте, где вы хотите сохранить файл CSV. hivetablename в таблицу вашего улья, которая будет храниться в формате csv.

+1

Я думаю, что она хочет, чтобы она была сохранена на hdfs, а не на локальном fs. –

1

Для внешней таблицы в улей, вы можете выполнить следующие действия:

  1. Создать внешнюю таблицу в улье

    CREATE EXTERNAL TABLE external_table (номер INT, имя STRING) ROW FORMAT полей, разделённых TERMINATED BY ',' LOCATION '/ user/hive/external/mytable /';

2. Загрузите файл данных от локального до HDFS расположения

hadoop fs -put /home/user1/Desktop/filename.csv /user/hive/external/mytable/ 

Вышеуказанные шаги могут решить вашу проблему.

+0

где я ввожу существующую таблицу, которую я создал? Я вижу это как создание пустой таблицы и размещение ее в локальном каталоге. Можете ли вы объяснить больше? – Laura

+2

РАСПОЛОЖЕНИЕ '/ user/hive/external/mytable /'; значение местоположения - это каталог местоположения HDFS и НЕ локальный каталог. при перемещении файла ieoop fs -put /home/user1/Desktop/filename.csv/user/hive/external/mytable /, из локального каталога в каталог местоположения HDFS – Farooque

+0

моя таблица уже хранится в hdf и может быть доступна с a/user/hive ... path – Laura

2

Это три процесса шаг работал хорошо для меня:

  1. в энцефалопатией, создать новую временную таблицу, хранящуюся в Textfile

    CREATE TABLE temp_table(id INT, name STRING) 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
    STORED AS TEXTFILE; 
    
  2. также в энцефалопатией, напишите источник данные во временную таблицу

    INSERT OVERWRITE TABLE temp_table 
    SELECT id, name FROM source_table; 
    
  3. из командной строки, скопируйте таблицу улей от его местоположения в HDFS вам локальный файл - осмотр должен показать файл как CSV (переименовывать соответственно при желании)

    hdfs dfs -copyToLocal /apps/hive/warehouse/temp_table/* /tmp/local_dir/ 
    

Если вы запустите команду SHOW CREATE TABLE temp_tableв HIVE, он сообщит вам точное местоположение таблицы в HDFS, например

| LOCATION              | 
| 'hdfs://hadoop_cluster/apps/hive/warehouse/temp_table'  | 
Смежные вопросы