2

如何使用 Pig 处理平面文件?例如,如果您有一条记录,其中前四个位置是年份,接下来的 5 个是产品代码,最后 8 个包含 MSRP,您将如何使用 Pig 查询此数据?我可能遗漏了一些简单的东西,但到目前为止我发现的所有内容都需要在使用 Pig 加载数据时使用分隔符。

下面提供了一些示例数据:

1999ABCDE12234.00
2000DCEFS00020.00
2012FFEWS00005.55

提前致谢。

杰里米

4

3 回答 3

4

根据位置拆分线的一种方法是使用REGEX_EXTRACT_ALL

例如:

A = LOAD 'flat.txt' as (line:chararray);
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, 
      '^(.{1,4})(.{1,5})(.*)$')) AS (year:int, prod_code:chararray, msrp:double);
dump B;
(1999,ABCDE,12234.00)
(2000,DCEFS,00020.00)
(2012,FFEWS,00005.55)
于 2012-10-06T18:45:27.500 回答
1

此外,还有一个内置的 SUBSTRING 函数,

A = LOAD 'flat.txt' as (line:chararray);

B = FOREACH A GENERATE SUBSTRING(line,0,3),SUBSTRING(line,4,8),SUBSTRING(line,9,16);

dump B;
于 2013-08-23T05:14:18.313 回答
0

之前的两个答案都很棒。此外,如果您的输入字符串很复杂或需要条件解析,您可以实现自己的 UDF

于 2013-09-12T10:52:59.027 回答