使用Piglatin加载文本文件时跳过标题

时间:2013-10-01 11:44:11

标签: hadoop apache-pig

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

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

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

5 个答案:

答案 0 :(得分:9)

如果您有猪版本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与原始行完全相同,没有标题行(假设标题行是文件中的第一行)。请注意,等级操作符仅适用于猪0.11,因此如果您有早期版本,则需要找到另一种方法。

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

答案 1 :(得分:9)

通常我解决这个问题的方法是在标题中使用FILTER。例如,请考虑以下数据示例:

STATE,NAME
MD,Bob
VA,Larry

我会这样做:

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

答案 2 :(得分:6)

这是另一种方法:

  • 以关系

    加载包含标题记录的完整文件
    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;
    

答案 3 :(得分:6)

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

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);

答案 4 :(得分:-1)

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