我有一个文本文件,它的第一行包含标题。现在我想对数据进行一些操作,但是在使用PigStorage加载文件时它也需要HEADER。我只是想跳过HEADER。是否可以(直接或通过UDF)这样做?
这是我用来加载数据的命令:
input_file = load '/home/hadoop/smdb_tracedata.csv'
USING PigStorage(',')
as (trans:chararray, carrier:chararray,aainday:chararray);
答案 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的存在,列中的空格