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)
如果你有猪版本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保持与原始输入文件相同的顺序
通常我解决这个问题的方法是在标题中使用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)
小智 6
这是另一种方法:
在关系中加载包括标题记录的完整文件
fileAllRecords = LOAD 'csvfilename' using PigStorage(',');
Run Code Online (Sandbox Code Playgroud)使用Linux tail命令仅流式传输数据记录
fileDataRecords = STREAM fileAllRecords THROUGH `tail -n +2` AS (chararray:f1 ..)
Run Code Online (Sandbox Code Playgroud)要验证删除标头记录,请使用以下命令 -
firstFewRecords = STREAM fileDataRecords THROUGH `head -20`;
DUMP firstFewRecords;
Run Code Online (Sandbox Code Playgroud)你想使用在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)
| 归档时间: |
|
| 查看次数: |
20078 次 |
| 最近记录: |