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

Paw*_*mar 15 hadoop apache-pig

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

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

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

Dav*_*oda 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;
Run Code Online (Sandbox Code Playgroud)

这将摆脱第一行,使New_input_file与原始行完全相同,没有标题行(假设标题行是文件中的第一行).请注意,等级操作符仅适用于猪0.11,因此如果您有早期版本,则需要找到另一种方法.

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

  • 请注意,如果您需要加载多个 csv 文件,这将不起作用。另外,您确定 `input_file` 中的行仍然与文件中的顺序相同吗? (2认同)

Don*_*ner 9

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

STATE,NAME
MD,Bob
VA,Larry
Run Code Online (Sandbox Code Playgroud)

我会去做的:

B = FILTER A BY state != 'STATE';
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是适用于多个文件中的多行标题的唯一答案。 (2认同)

小智 6

这是另一种方法:


Mik*_*one 6

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

CSVExcelStorage(String delimiter, String multilineTreatmentStr, String eolTreatmentStr, String headerTreatmentStr) 
Run Code Online (Sandbox Code Playgroud)

猪代码如下:

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);
Run Code Online (Sandbox Code Playgroud)