我有一个文本文件,它的第一行包含标题。现在我想对数据做一些操作,但是在使用 PigStorage 加载文件时,它也需要 HEADER。我只想跳过标题。是否可以这样做(直接或通过 UDF)?
这是我用来加载数据的命令:
input_file = load '/home/hadoop/smdb_tracedata.csv'
USING PigStorage(',')
as (trans:chararray, carrier:chararray,aainday:chararray);
我有一个文本文件,它的第一行包含标题。现在我想对数据做一些操作,但是在使用 PigStorage 加载文件时,它也需要 HEADER。我只想跳过标题。是否可以这样做(直接或通过 UDF)?
这是我用来加载数据的命令:
input_file = load '/home/hadoop/smdb_tracedata.csv'
USING PigStorage(',')
as (trans:chararray, carrier:chararray,aainday:chararray);
通常我解决这个问题的方法是对我知道在标题中的东西使用过滤器。例如,考虑以下数据示例:
STATE,NAME
MD,Bob
VA,Larry
我会去做的:
B = FILTER A BY state != 'STATE';
如果你有 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 保持与原始输入文件相同的顺序
这是另一种方法:
加载完整的文件,包括关系中的标题记录
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;
您想使用在 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);
当您尝试转换不兼容的数据类型时,通常会发生这种错误。我遇到了类似的问题和原因 --> 我尝试加载的文件包含标题并显示错误。其他可能的原因可能是列中存在 NA's , Spaces