处理猪的刺分隔符

时间:2014-09-16 14:17:06

标签: hadoop unicode apache-pig

My Source是一个日志文件,其中“þ”为分隔符。我正在尝试在Pig中读取此文件。请查看我尝试过的选项。

选项1:

使用PigStorage(“þ”) - 由于无法处理unicode字符,因此无法解决问题。

选项2:

我尝试将这些行作为字符串读取并尝试用“þ”分割该行。这也没有用,因为STRSPLIT遗漏了最后一个字段,因为它最后有“\ n”。

我可以在网上看到多个问题,但无法找到解决方案。 请指导我。

刺细节: http://www.fileformat.info/info/unicode/char/fe/index.htm

2 个答案:

答案 0 :(得分:2)

这是你期待的解决方案吗?

input.txt:  
helloþworldþhelloþworld  
helloþworldþhelloþworld  
helloþworldþhelloþworld  
helloþworldþhelloþworld  
helloþworldþhelloþworld  

PigScript:
A = LOAD 'input.txt' as line;  
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*)þ(.*)þ(.*)þ(.*)'));  
dump B;  

Output:  
(hello,world,hello,world)  
(hello,world,hello,world)  
(hello,world,hello,world)  
(hello,world,hello,world)  
(hello,world,hello,world)  

添加了具有不同数据类型的第二个选项:

input.txt  
helloþ1234þ1970-01-01T00:00:00.000+00:00þworld  
helloþ4567þ1990-01-01T00:00:00.000+00:00þworld  
helloþ8901þ2001-01-01T00:00:00.000+00:00þworld  
helloþ9876þ2014-01-01T00:00:00.000+00:00þworld  

PigScript:  
A = LOAD 'input.txt' as line;  
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*)þ(.*)þ(.*)þ(.*)')) as (f1:chararray,f2:long,f3:datetime,f4:chararray);  
DUMP B;  
DESCRIBE B;

Output:
(hello,1234,1970-01-01T00:00:00.000+00:00,world)  
(hello,4567,1990-01-01T00:00:00.000+00:00,world)  
(hello,8901,2001-01-01T00:00:00.000+00:00,world)  
(hello,9876,2014-01-01T00:00:00.000+00:00,world)  

B: {f1: chararray,f2: long,f3: datetime,f4: chararray}

另一个刺符号A¾:

input.txt  
1077A¾04-01-2014þ04-30-2014þ0þ0.0þ0  
1077A¾04-01-2014þ04-30-2014þ0þ0.0þ0  
1077A¾04-01-2014þ04-30-2014þ0þ0.0þ0  

PigScript:  
A = LOAD 'jinput.txt' as line;  
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*)A¾(.*)þ(.*)þ(.*)þ(.*)þ(.*)')) as (f1:long,f2:datetime,f3:datetime,f4:int,f5:double,f6:int);  
DUMP B;  
describe B;  

Output:  
(1077,04-01-2014,04-30-2014,0,0.0,0)  
(1077,04-01-2014,04-30-2014,0,0.0,0)  
(1077,04-01-2014,04-30-2014,0,0.0,0) 
B: {f1: long,f2: datetime,f3: datetime,f4: int,f5: double,f6: int}

}

答案 1 :(得分:0)

这应该有效(将unicode代码点替换为适用于你的代码点,这适用于资本刺):

A = LOAD 'input' USING 
B = FOREACH A GENERATE STRSPLIT(f1, '\\u00DE', -1);

我不明白为什么要排除最后一个字段。

不知何故,这不起作用:

A = LOAD 'input' USING PigStorage('\00DE');