【问题标题】:Skipping the header while loading the text file using Piglatin使用 Piglatin 加载文本文件时跳过标题
【发布时间】:2013-10-07 13:27:08
【问题描述】:

我有一个文本文件,它的第一行包含标题。现在我想对数据进行一些操作,但是在使用 PigStorage 加载文件时,它也需要 HEADER。我只想跳过标题。是否可以这样做(直接或通过 UDF)?

这是我用来加载数据的命令:

input_file = load '/home/hadoop/smdb_tracedata.csv'
USING PigStorage(',')
as (trans:chararray, carrier:chararray,aainday:chararray);

【问题讨论】:

  • 请贴出您尝试过的代码。在此之前,请先简要了解一下sscce.org
  • 老兄,这是问题所在,而不是 cmets。此外,在我看来,这根本不像 Python。你为什么用“python”标记这个问题?
  • 请注意我在我的2 cmets中所说的;否则反对票将不断涌现;此外,我会提请您注意 Stack Overflow 具有非常好的格式化功能,因此请使用它们 - 否则很难阅读您发布的内容。
  • @ErikAllik 正如你所知,他可能用 python 标记了这个问题,因为 pig 函数可以用 python 编写。另外,对于 pig 中的此类问题,由于文档的原因,很难生成 sscce。

标签: hadoop apache-pig


【解决方案1】:

通常我解决此问题的方法是对我知道的标题中的内容使用过滤器。例如,考虑以下数据示例:

STATE,NAME
MD,Bob
VA,Larry

我会的:

B = FILTER A BY state != 'STATE';

【讨论】:

  • 这似乎是唯一适用于多个文件中的多行标题的答案。
  • 这仅适用于标题与数据具有相同列的情况
【解决方案2】:

如果你有 pig 0.11 版,你可以试试这个:

input_file = load '/home/hadoop/smdb_tracedata.csv' USING PigStorage(',') as (trans:chararray, carrier :chararray,aainday:chararray);

ranked = rank input_file;

NoHeader = Filter ranked by (rank_input_file > 1);

Ordered = Order NoHeader by rank_input_file

New_input_file = foreach Ordered Generate trans, carrier, aainday;

这将删除第一行,使 New_input_file 与原始文件完全相同,没有标题行(假设标题行是文件中的第一行)。请注意,rank 运算符仅在 pig 0.11 中可用,因此如果您有更早的版本,则需要找到另一种方法。

编辑:添加有序行以确保 New_input_file 保持与原始输入文件相同的顺序

【讨论】:

  • 请注意,如果您需要加载多个 csv 文件,这将不起作用。另外,您确定input_file 中的行的顺序仍与文件中的顺序相同吗?
  • 不,它不适用于多个文件(我回复时没有想到这一点)。给定的代码不会保留顺序。但是,如果您需要保留顺序(并且没有多个文件问题),只需添加行 ordered = order NoHeader by rank_input_file 以使其按顺序排列。如果您在以后的操作中使用 NoHeader 而不是 New_input_file ,则可以使用排名在代码中您需要它的任何点通过使用 order by rank 将数据恢复为原始顺序。
  • 这真的很有帮助,谢谢戴维斯。
  • 如果你有 pig 0.12 或更新版本,有一个更简单的方法。使用 CSVExcelStorage 查看我的答案。
【解决方案3】:

这是另一种方法:

  • 加载完整的文件,包括关系中的标题记录

    fileAllRecords = LOAD 'csvfilename' using PigStorage(',');
    
  • 使用 Linux tail 命令仅流式传输数据记录

    fileDataRecords = STREAM fileAllRecords THROUGH `tail -n +2` AS (chararray:f1 ..)
    
  • 要验证标头记录是否已删除,请使用以下命令 -

    firstFewRecords = STREAM fileDataRecords THROUGH `head -20`;
    DUMP firstFewRecords;
    

【讨论】:

    【解决方案4】:

    您想使用存钱罐中的CSVExcelStorage。它允许设置有关如何处理标题、行尾、引用字段和其他 CSV 选项的参数。您想要的构造函数仅在至少 0.12 的 PIG 版本中可用,并且具有签名:

    CSVExcelStorage(String delimiter, String multilineTreatmentStr, String eolTreatmentStr, String headerTreatmentStr) 
    

    猪代码如下:

    REGISTER /usr/lib/pig/piggybank.jar;
    
    input_file = load '/home/hadoop/smdb_tracedata.csv'
    USING CSVExcelStorage(',', 'default', 'NOCHANGE', 'SKIP_INPUT_HEADER')
    as (trans:chararray, carrier:chararray,aainday:chararray);
    

    【讨论】:

      【解决方案5】:

      当您尝试转换不兼容的数据类型时,通常会发生此类错误。我遇到了类似的问题和原因 --> 我尝试加载的文件包含标题并显示错误。其他可能的原因可能是列中存在 NA's , Spaces

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2012-12-24
        • 1970-01-01
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多