如何在 PIG 中为无分隔符文件创建模式?

Posted

技术标签:

【中文标题】如何在 PIG 中为无分隔符文件创建模式?【英文标题】:How can I create a schema for a no-delimiter file in PIG? 【发布时间】:2014-08-29 12:26:18 【问题描述】:

我有以下类型的 CDR:

068373748102208100167682477351905149071PLAN1MOCCUST10612287077212:07:1201/01/2012
068373748102208100167682477351905149071PLAN1MTCCUST20600000001312:15:0901/01/2012
068373748102208100167682477351905149071PLAN1SMSCUST10613637193012:18:1801/01/2012
068373748102208100167682477351905149071PLAN1SMSCUST10612899062012:21:0701/01/2012

我必须使用具有以下架构的 PIG 加载此文件:

MSIDN:IMSI:IMEI:PLAN:CALL_TYPE:CORRESP_TYPE:CORRESP_ISDN:DURATION:TIME:DATE

我知道每个模式的长度,但我不知道如何以正确的格式加载数据。这是所需的长度格式,从第一列开始:

13
15
12
5
3
5
11
1
hh:mm:ss
dd/mm/yyyy

【问题讨论】:

【参考方案1】:

您可以查看 piggybank 中的 FixedWidthLoader 来加载位置分隔文件(我曾使用它来加载类似于您在此处提到的文件)。

例如,我们可以如下指定列位置和列映射

A = LOAD 'inputfile.txt' 使用 org.apache.pig.piggybank.storage.FixedWidthLoader( '1-6,7-5', 'WRITE_HEADER','col1: chararray, col2: chararray');

http://pig.apache.org/docs/r0.12.0/api/org/apache/pig/piggybank/storage/FixedWidthLoader.html

【讨论】:

能否请您解释一下上述场景中的这个查询,以便我更好地理解【参考方案2】:

一种可能的解决方案可以使用普通的 pig loader 加载,然后通过 UDF 传递以获取列。我将尝试提供代码并在今晚发布。正如承诺的那样:

    ]$ more cdr.txt
    068373748102208100167682477351905149071PLAN1MOCCUST10612287077212:07:1201/01/2012
    068373748102208100167682477351905149071PLAN1MTCCUST20600000001312:15:0901/01/2012
    068373748102208100167682477351905149071PLAN1SMSCUST10613637193012:18:1801/01/2012
    068373748102208100167682477351905149071PLAN1SMSCUST10612899062012:21:0701/01/2012

    ]$ more cdr.py
    import sys

    def mysubstr(input,start,nc):

            return input[start:nc]

    ]$ more cdr.pig
    REGISTER 'cdr.py' using jython as mysubstr;
    A = LOAD 'cdr.txt' AS (inp:chararray);
    B = FOREACH A GENERATE                
    inp, mysubstr.mysubstr(inp,0,13), 
    mysubstr.mysubstr(inp,14,29), 
    mysubstr.mysubstr(inp,30,42);
    DUMP B;

输出: (068373748102208100167682477351905149071PLAN1MOCCUST10612287077212:07:1201/01/2012,0683737481022,810016768247735,905149071PLA) (068373748102208100167682477351905149071PLAN1MTCCUST20600000001312:15:0901/01/2012,0683737481022,810016768247735,905149071PLA) (068373748102208100167682477351905149071PLAN1SMSCUST10613637193012:18:1801/01/2012,0683737481022,810016768247735,905149071PLA) (068373748102208100167682477351905149071PLAN1SMSCUST10612899062012:21:0701/01/2012,0683737481022,810016768247735,905149071PLA)

【讨论】:

【参考方案3】:

PigStorage(默认加载和存储功能)不处理这个 案子。您需要编写自己的加载函数。使用 PigStorage 作为一个模型这应该不会太难。代替 寻找字段分隔符,您只需解析出基于的字段 长度,然后使用标准字符串函数来修剪空白。

阅读此http://pig.apache.org/docs/r0.7.0/udf.html#Store+Functions

【讨论】:

以上是关于如何在 PIG 中为无分隔符文件创建模式?的主要内容,如果未能解决你的问题,请参考以下文章

在 rsreportserver.config 文件中,如何将 CSV 导出设置为无字段分隔符

Pig Latin 中的用户定义函数

如何在猫鼬中为 geojson 数据创建模式?

无法在 PIG 中转储关系

如何在 Windows 中为可以锁定(只读)和解锁驱动器的 diskpart cmd 创建批处理文件

Pig — 如何加载包含用双引号括起来并用逗号分隔的字段的 CSV 文件