2015-12-28 35 views
1

這是我的樣本數據使用REGEX_EXTRACT_ALL,如何豬

subId=00001111911128052627,towerid=11232w34532543456345623453456984756894756,bytes=122112212212212218.4621702216543667E17 
subId=00001111911128052639,towerid=11232w34532543456345623453456984756894756,bytes=122112212212212219.6726312167218586E17 
subId=00001111911128052615,towerid=11232w34532543456345623453456984756894756,bytes=122112212212212216.9431647633139046E17 

我的預期產出將是一個元組,其中每個字段表示一個匹配的組:

(capturing_group1,capturing_group2,.. 。,capturing_groupN)

例如(00001111911128052627,11232w34532543456345623453456984756894756,122112212212212216.9431647633139046E17)

這是我的方法,

A = load '/home/hduser/Desktop/arrtest1.txt' using TextLoader as (line:chararray); 
b = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*)[subId=](.*)[towerid=](.*)[bytes=](.*)')) AS (F1,F2,F3); 

但我沒有得到我的結果。

+0

你有4個捕獲組定義,但你只需要3個。此外,你正在使用'[subId =]'等字符類匹配集合中的1個符號('s'或'u')。 ..或'=')。 '。*'太貪婪,所以你得到的結果是出乎意料的。嘗試'A = LOAD'/home/hduser/Desktop/arrtest1.txt'使用TEXTLOADER()AS(LINE:CHARARRAY); b = FOREACH A GENERATE FLATTEN( REGEX_EXTRACT_ALL(LINE,'^ subId =([^ =] *)bytes =([^ =] *)$')) AS :CHARARRAY,F2:CHARARRAY,F3:CHARARRAY),LINE;' –

+0

@stribizhev:''REGEX_EXTRACT_ALL''返回一個包含所有捕獲組的元組,逗號''''在數據結構中不在提取的字符串中(我已經在在線演示中重新創建了元組作爲字符串,只是爲了顯示與期望的OP結果匹配)。 –

回答

0

根據您輸入的例子,你可以用這個表達式嘗試:

REGEX_EXTRACT_ALL(line,'subId=([^,]*),towerid=([^,]*),bytes=(.*)') 

您可以檢查這個表達式at this link的行爲。

更新:爲什麼不使用.*來檢查字段?

默認克林運營商的貪婪的本性*導致正則表達式引擎,直到字符串的結束比賽,然後回去每次一個字符,並檢查正則表達式匹配的下一部分(例如,則搜索在第一個.*之後的逗號,)。

所以最終所有的正則表達式匹配以下,但不同的步驟來完成的過程:

[a-zA-Z]+=(.*),[a-zA-Z]+=(.*),[a-zA-Z]+=(.*) - 1142 steps

subId=([^,]*),towerid=([^,]*),bytes=(.*) - 96 steps

如果你不關心的領域名稱和要純字母字段(大寫或小寫):

(?i)[a-z]+=([^,]*)[a-z,]+=([^,]*),[a-z,]+=(.*) - 58 steps

NB:Apache的豬正則表達式引擎是基於Java的一個所以不區分大小寫的標誌(?i)也可能起作用。

+0

b = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'[a-zA-Z] + =(。*),[a-zA-Z] + =(。*),[a-zA-Z] + = (。*)'))AS(F1,F2,F3);我這樣做了:-)謝謝。 –

+0

@RinkuBuragohain:這種行爲有所不同:它不檢查字段的名稱,由於回溯,速度較慢:''。*''全部匹配到最後(每次使用),然後返回以檢查是否存在正則表達式可以匹配的一些點。 –

+0

@RinkuBuragohain:我已經用一些基準更新了答案,關於使用''[^,] *''而不是''。*''。請注意,在我使用過的最後一個捕獲組中''。*''也導致它必須匹配直到結束 –