2013-04-20 89 views
3

我遇到以下問題... 我使用Hive並希望添加具有多個(不同)字符串行的文件。那些包含固定大小的字段,如下所示:從Hive中的字符串中分離字段

A20130420bcd 34 fgh 

其中字段的長度爲1,8,6,4,3。 分居它應該是這樣的:

「A,20130420,BCD,FGH」

是否有可能讀取字符串,並將其分類到現場,除了得到它作爲一個子像

各個領域
substring(col_value,1,1) Field1 

etc? 我會想象切割字符串的已讀部分會提高性能,但我可以想辦法用給定的函數here來做到這一點。其次,如前所述,有不同類型的字符串,由第一個字符排序和標識。現在只需使用WHERE-Statement檢查那些字符串,但它很可怕,因爲它貫穿整個文件以查找只有第一個字符串。有沒有什麼辦法通過他們的號碼閱讀特定的行?如果我知道,第一個字符串是特定類型的,可以直接讀取它?

右它看起來像這樣:

insert overwrite table TEST 
SELECT 
substring(col_value,1,1) field1, 
... 
substring(col_value,10,3) field 5 
from temp_data WHERE substring(col_value,1,1) = 'A'; 

上任何想法?

我很樂意聽到的一些想法=)

+0

蜂巢0.10.0.21,有人嗎? – Maltram 2013-04-22 18:26:13

+0

除了檢查特定的字段之外,還有一些方法可以通過索引來處理單個行? – Maltram 2013-04-28 10:36:21

+0

你在擔心多個substring操作和全表掃描的性能影響嗎?這是我們正在討論的Hive,對吧?如果性能出現問題,只需向集羣添加更多節點即可。 – 2013-05-17 16:01:21

回答

1

你需要寫你的仿製UDF分析器,它輸出的結構或映射或任何合適。你可以參考UDF that output multi-values

,那麼你可以寫

insert overwrite table output 
select parsed.first, parsed.second 
from (
    select parse(taget) 
    from input 
) parsed 
where first='X'; 

關於第二個問題,你可能需要檢查「解釋」蜂巢的命令,看是否蜂巢爲你做過濾下推。(只是看有多少地圖酌減。需要,理論上它應該是一個地圖,這取決於1.hive版本, 2.輸出表格式 )

在一般意義上,這就是爲什麼數據庫是流行 - 以優化考慮你。

+1

謝謝,我看着它,它完美的工作。 正如你所提到的那樣,性能差異不是那麼容易理解,因爲它本身做了很多優化。 – Maltram 2014-04-02 13:36:18