16

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

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

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

5 回答 5

10

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

STATE,NAME
MD,Bob
VA,Larry

我会去做的:

B = FILTER A BY state != 'STATE';
于 2013-10-01T15:20:11.750 回答
9

如果你有 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 保持与原始输入文件相同的顺序

于 2013-10-01T12:42:26.130 回答
7

这是另一种方法:

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

    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;
    
于 2014-03-08T22:03:59.263 回答
6

您想使用在 piggybank 中找到的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);
于 2015-10-15T17:20:23.050 回答
-1

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

于 2016-03-26T05:55:13.600 回答