【问题标题】:Process Flat File with Pig使用 Pig 处理平面文件
【发布时间】:2013-09-12 18:52:59
【问题描述】:

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

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

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

提前致谢。

杰里米

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    根据位置分割线的一种方法是使用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)
    

    【讨论】:

    • 我假设这种方法效率不高,我想用分隔符存储它以供将来处理,对吗?
    • 你可以肯定地调整这个正则表达式,但是如果你有可能用分隔符存储数据,那么这样做肯定比处理复杂的正则表达式更有效
    【解决方案2】:

    另外,还有一个内置的 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;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        相关资源
        最近更新 更多