【问题标题】:How to read csv file seperated by semicolon in PIG如何在 PIG 中读取以分号分隔的 csv 文件
【发布时间】:2015-04-06 03:51:42
【问题描述】:

如何在 PIG 中读取分号分隔的 CSV 文件? 数据也可以包含分号。

例如 输入行:"Name";"Age";"Address";"简历包含特殊字符,如 ;,$#$@^";"Rating"

输出:这些字段中的每一个都应该加载到列中,尤其是“简历”列应该有“简历包含特殊字符,例如;,$#$@^”


注意:我已经尝试过 PigStorage、CVSLoader 但仍然无法使其工作,因为分隔符也可能在数据中。

【问题讨论】:

    标签: hadoop apache-pig


    【解决方案1】:

    您可以使用piggybank.jar 来读取此类文件。

    首先您需要在您的 pig 脚本中注册 piggybank.jar,然后您可以在您的脚本中使用这些函数。以下是代码 sn-p(我还没有测试过,但我相信它会成功)

    REGISTER 'piggybank-0.12.0.jar';
    
    DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage();
    
    input_lines = LOAD 'PATH/TO/FILES' using CSVExcelStorage(';', 'YES_MULTILINE') AS (name:chararray, age:int, address:chararray, details:chararray);
    

    更多详情请参考thisthis

    【讨论】:

      【解决方案2】:

      试试这个解决方案。

      A = load 'pigconcat' using PigStorage(';') as (a:chararray,b:chararray,c:chararray,d:chararray,e:chararray,f:chararray);
      
      B = foreach A GENERATE a,b,c,CONCAT(CONCAT(d,';'),e) as (resume:chararray),f; 
      
      C= foreach B GENERATE resume;
      
      dump C;
      

      【讨论】:

        【解决方案3】:

        如果输入数据中也存在分隔符,那么我的建议是使用Regex 而不是任何加载技术(PigStorage,CSVStorage)。这将为您的输入提供更灵活的控制。我同意许多人不会因为性质复杂而选择Regex,但是使用正则表达式可以轻松解决这类问题。

        示例

        输入

        "Name";"Age";"Address";"Resume contains special char like ;,$#$@^";"Rating"
        "Name1";"Age1";"Address1";"Resume;$# contains ;@^ special char like ;,$#$@^";"Rating"
        

        PigScript:

        A = LOAD 'input' AS (line:chararray);
        B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'("\\w+");("\\w+");("\\w+");("[\\w+\\s;$,#@^]+");("\\w+")')) AS(name,age,address,resume,rating);
        C = FOREACH B GENERATE resume;
        DUMP C;
        

        输出:

        ("Resume contains special char like ;,$#$@^")
        ("Resume;$# contains ;@^ special char like ;,$#$@^")
        

        注意:
        这是一个非常通用的解决方案,无论您的输入 column(resume) 中存在任何数量的特殊字符,它都可以正常工作。在这个脚本中,我只打印了resume column,如果您需要其他列,请包含在relation C 中。

        【讨论】:

          猜你喜欢
          • 2018-04-01
          • 2016-04-22
          • 2017-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          • 2019-09-26
          相关资源
          最近更新 更多