2011-09-14 65 views
1

我有一些数据日志行像有多个分隔符

Sep 10 12:00:01 10.100.2.28 t: |US,en,5,7350,100,0.076241,0.105342,-1,0,1,5,2,14,,,0,5134,7f378ecef7,fec81ebe-468a-4ac7-b472-8bd1ee88bfc2 

Sep 10 12:00:01 10.100.2.28 t: |US,en,3,22427,100,0.05816,0.04018,-1,0,1,15,15,0,24383,cyclops.untd.com/,0,2796,2c5de71073,4858b748-121a-4f60-8087-97a8527d57c6 

Sep 10 12:00:01 10.100.2.28 t: |us,en,6,16839,100,-1,-1,-1,17,1,0,-1,0,13819,d.tradex.openx.com/,0,-1,,4f805e3b-86b7-4dee-ae68-24e726cde954 

猪负载问题没有,因为它是明显的有两个分隔符(逗号和空格)。虽然使用PigStorage功能,我想我只能使用其中的一个....这使我与另一个分隔符(空格或逗号)的另一个字符串chararray。

我想访问该chararray的每个成员,但不能这样做。我也曾尝试记号化,但是,让一个袋子,我不认为在一个袋子里的物品排序,从而可以单独访问...

僧侣任何帮助,将不胜感激......

Tanuj

回答

2

您可以编写自己的自定义user-defined load function,以任何您想要的方式处理加载。通常,如果你的格式是某种奇怪的自定义格式,那么你将会被卡住。您还可以获得自定义加载器自动命名列的好功能。

您的其他选择是在您的数据进入Pig之前对其进行预处理,以便很好地进行分隔。我不确定你的数据是如何设置的或者它是如何进入的,所以我不确定这是否可行。一般来说,一点数据修饰和消毒不会是一件坏事。

+0

偶然发现了这个莫名其妙的最佳方式 - 有实际上是一个相当可行的第三个选项,而不是实现一个整体,全面的'LOAD' UDF,人们可以使用流媒体。基本上,通过一个简单的[在这里插入fav lang]脚本或者只是简单的* nix命令来加载所有的东西作为行和流。这个特殊的例子可以很容易地通过流'tr',''\ t''和使用正确的模式来解决。 – TC1

1

我能想到的最简单的解决方案是使用内置PigStorage加载器作为两个分隔符之一,然后使用STRSPLIT来获得另一个分隔符。

实例(假设有19个逗号分隔的字段,因为这就是它看起来像):

A = LOAD 'myData' USING PigStorage(' ') AS 
    (date:chararray,restOfCommaDelimitedFields:chararray); 
B = FOREACH A GENERATE date, FLATTEN(STRSPLIT(restOfCommaDelimitedFields,19)) AS 
    (country,language,field3,field4...etc); 

注意是否有任何的逗号分隔的字段之间的空间,这将打破。

0

编写您自己的UDF,它会为您解决问题