2014-10-27 47 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 '\;' 

如果可能我希望用戶ID和年份字段存儲爲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

非常感謝,幫助了很多 – 2014-10-30 02:39:29

+0

嗨,一個更多的幫助,相同的數據。 而不是使用java RegexSerde,我如何使用unix的sed命令來清理數據並獲取我的輸出。 我試着瞭解sed命令並找到了替換選項。所以我可以刪除「doule報價。 但是我怎麼處理額外的數據中間出現的分號 請幫忙 Regards, Harish – 2014-11-12 19:58:39