如何使用 Pig 处理平面文件?例如,如果您有一条记录,其中前四个位置是年份,接下来的 5 个是产品代码,最后 8 个包含 MSRP,您将如何使用 Pig 查询此数据?我可能遗漏了一些简单的东西,但到目前为止我发现的所有内容都需要在使用 Pig 加载数据时使用分隔符。
下面提供了一些示例数据:
1999ABCDE12234.00
2000DCEFS00020.00
2012FFEWS00005.55
提前致谢。
杰里米
如何使用 Pig 处理平面文件?例如,如果您有一条记录,其中前四个位置是年份,接下来的 5 个是产品代码,最后 8 个包含 MSRP,您将如何使用 Pig 查询此数据?我可能遗漏了一些简单的东西,但到目前为止我发现的所有内容都需要在使用 Pig 加载数据时使用分隔符。
下面提供了一些示例数据:
1999ABCDE12234.00
2000DCEFS00020.00
2012FFEWS00005.55
提前致谢。
杰里米
根据位置拆分线的一种方法是使用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)
此外,还有一个内置的 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;
之前的两个答案都很棒。此外,如果您的输入字符串很复杂或需要条件解析,您可以实现自己的 UDF