我有一些数据记录行,如
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的每个成员但不能这样做。我也尝试过TOKENIZE,但是它给了一个包,我不认为包里的物品是订购的,因此可以单独访问......
蒙克斯的任何帮助都将不胜感激......
Tanuj
答案 0 :(得分:2)
您可以编写自己的自定义user-defined load function,以任何方式处理加载。通常,如果您的格式是某种奇怪的自定义格式,那么您将无法做到这一点。您还可以获得使用自定义加载程序自动命名列的好功能。
您的另一个选择是在数据进入Pig之前对数据进行预处理,以便很好地分隔。我不确定您的数据是如何设置的或它是如何进入的,因此我不确定这是否可行。一般来说,一点点的数据整理和消毒从来都不是坏事。
答案 1 :(得分: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);
请注意,如果任何逗号分隔的字段之间有空格,则会中断。
答案 2 :(得分:0)
编写自己的UDF,这将是解决问题的最佳方法