2015-02-10 47 views
1

我在扁平豬的字符串後實現字段對象(模式)時出現問題。我有以下代碼:扁平化字符串後豬的模式

Data = load'data/*。txt'using PigStorage()AS(....,date:chararray,.....);

B =的foreach數據FLATTEN(REGEX_EXTRACT_ALL(日期, ' 「()/()/(*)

):():。。。(*)」' ))AS(month:int,day:int,year:int,hour:int,min:int,second:int);

--B =過濾器B年份== 2015;

--B =按月份過濾器B == 1 OR月份== 2; C = foreach B生成速度,月,日,年,小時,分鐘;

使用PigStorage(',')將C存儲到'data/out_files'中;

凡日期的格式爲(「2015年2月23日23時56分49秒」)

這工作完全正常。但是當我在B(年份== 2015或月== 1或月份== 2)中使用過濾器時,此代碼不起作用。你有一個很好的主意,如何使用任何領域平坦的字符串?感謝您的幫助。

回答

1

你可以試試嗎?

輸入:

2/23/2015 23:56:49 
1/23/2014 23:56:49 
9/23/2014 23:56:49 
8/23/2014 23:56:49 

PigScript:

A = LOAD 'input' AS (date:chararray); 
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(date, '([0-9]+)/([0-9]+)/([0-9]+)\\s+([0-9]+):([0-9]+):([0-9]+)')) AS (month,day,year,hour,min,second); 
C = FILTER B BY (month==1) OR (month==2) OR (year==2015); 
D = FOREACH C GENERATE month,day,year,hour,min,second; 
DUMP D; 

輸出:

(2,23,2015,23,56,49) 
(1,23,2014,23,56,49) 

的下面的正則表達式也適用。

B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(date, '(\\d+)/(\\d+)/(\\d+)\\s+(\\d+):(\\d+):(\\d+)')) AS (month,day,year,hour,min,second); 
+0

謝謝Sivasakthi,仍然出現錯誤,無法將bytearray轉換爲int。這是由於C = FILTER B BY year == 2015。當我將年份更改爲int時,仍然得到以前的錯誤。 – Aarav 2015-02-10 21:58:49

+1

默認情況下,pig會將bytearray轉換爲int,作爲隱式類型轉換的一部分,所以這應該起作用。我沒有在上面的腳本中遇到任何問題,並且你提到的過濾語句對我來說都很好。你可以關閉你的終端,再次打開它並重新運行腳本? (我使用Pig 0.13版本。) – 2015-02-11 02:12:35