2014-10-27 5 views
2

Имею свои данные в этом формате.Сбор данных из файла с помощью Hive

"123";"mybook1";"2002";"publisher1"; 
"456";"mybook2;the best seller";"2004";"publisher2"; 
"789";"mybook3";"2002";"publisher1"; 

поля заключены в "" и ограничены; Также имя книги может содержать ';' между.

Можете ли вы сказать мне, как загрузить эти данные из файла в улей таблицу

ниже запрос, который я использую в настоящее время, очевидно, не работает;

create table books (isbn string,title string,year string,publisher string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;' 

Если возможно, я хочу, чтобы поля userid и year сохранялись как Int. Пожалуйста, помогите

Спасибо, Хариш

ответ

0

Что вам не хватает в RegexSerDe. Это очень полезно при вставке только части текста из ввода. Ваш DDL идет как:

create table books (isbn string, title string, year string, publisher string) 
    ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
    WITH SERDEPROPERTIES (
    "input.regex" = "(?:\")(\\d*)(?:\"\;\")([^\"]*)(?:\"\;\")(\\d*)(?:\"\;\")([^\"]*)\"(?:\;)" , 
    "output.format.string" = "%1$s %2$s %3$s %4$s" 
    ) 
    STORED AS TEXTFILE; 

регулярное выражение может выглядеть комплекс на первый взгляд из-за ускользающей и не захватив групп. На самом деле он содержит 2 группы (\d*) & ([^"]*) помещается поочередно два раза. Не связанный захватом группа ((?:) только помогает удалить ненужный контекст Группы ([^"]*) также заботиться. «;».. В BookName поля

Но ничего не приходит без стоимости Несмотря на все его функцию, RegexSerDe поддерживает только строку . поля Все, что вы можете сделать, это позвонить по умолчанию улого UDF cast сделать преобразование при выборе данных из таблицы, например, (фактический синтаксис может немного отличаться):..

SELECT cast(year as int) from books; 

Надеется, что это помогает

+0

Спасибо большое. Это помогло много –

+0

Привет, Еще одна помощь с теми же данными. вместо использования java RegexSerde, как я могу использовать команду sed из unix для очистки данных и получения моего вывода. Я попытался узнать о команде sed и нашел вариант замены. Таким образом, я могу удалить "doule цитаты Но как я могу справиться с дополнительной;. С запятой, которая приходит в середине данных Пожалуйста, помогите С уважением, Хариш –