2015-05-28 4 views
0

Я пытаюсь хранить следующие данные в CSV-файл в улей таблицу, но не в состоянии сделать это успешноЗагрузить данные в формате CSV в улей таблице

Ann, 78%,7, 
Beth,81%,5, 
Cathy,83%,2, 

Данные присутствует в CSV-файле. Я создал таблицу в Hive, используя ниже определение:

Hive> CREATE TABLE test1 (Name String, Perc String, Rank String) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ("input.regex" = "^(\w+)\,(\w+)\%\,(\w+)$", 
"output.format.string" = "%1$s %2$s %3$s") 
STORED AS TEXTFILE;"  
ok 
hive> load data local inpath '/tmp/input.csv' into table test1; 
ok 
hive> Select * from test1; 
ok 

Name Perc Rank 
Null Null Null 
Null Null Null 
Null Null Null 

Я не могу понять ошибку. Полученные данные не загружаются в таблицу.

+0

Почему вы используете 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'? –

ответ

1

Вам не нужно использовать RegexSerDe. Вы должны просто установить разделитель как запятую.

CREATE TABLE test1 (Name String, Perc String, Rank String) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

Вы также можете проверить это CVS Serde. https://github.com/ogrodnek/csv-serde

+0

Просто разъяснение. Если ваши данные '.csv' содержат заголовки, вам нужно использовать' CSVSerde'. В противном случае это нормально. –

+0

Отличная вещь для добавления, спасибо! –

+0

Спасибо за ваш ответ .. Причина, по которой я использовал Regex, заключается в том, что входные данные имеют% во втором поле, которое я не хочу помещать в таблицу. Таким образом, ожидаемые данные, которые я хочу загрузить, - –

0

Может вы использовать встроенное регулярное выражения UDF ульи, как это:

create table temp (raw STRING); 

load data local inpath '/tmp/input.csv' into table temp; 

create table table1 
as 
select regexp_extract(line, "^(\w+)\,(\w+)\%\,(\w+)$", 1) Name, 
regexp_extract(line, "^(\w+)\,(\w+)\%\,(\w+)$", 2) Perc, 
regexp_extract(line, "^(\w+)\,(\w+)\%\,(\w+)$", 3) Rank 
from temp; 
0

на основе ваших данных образца резюме, ваше регулярное выражение не соответствует замыкающей запятой, и это также не соответствует дополнительному пробелу как показанный в первой строке выборки данных cvs. Ваше регулярное выражение должно быть изменено с: ^ (\ w +) \, (\ w +) \% \, (\ w +) $ To: ^ (\ w +) \, \ s * (\ w +) \% \, (\ w +) \, $

0

Используйте OpenCSVSerde, если вам нужна гибкость.

При этом у вас есть полный контроль над разделителем, символом цитаты, символом эвакуации, нулевой обработкой и обработкой заголовков.

Посмотрите here и here.

Смежные вопросы