我正在尝试通过Pig程序使用Amazon的Elastic Map Reduce来解析由我们的服务生成的制表符分隔数据文件。事情进展顺利,但我们所有的数据文件都包含一个标题行,用于定义每列的用途。显然,(字符串)标题不能转换为数字数据值,因此我收到来自Pig的警告,如下所示:
2011-03-17 22:49:55,378 [main] WARN org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigHadoopLogger - org.apache.pig.builtin.PigStorage: Unable to interpret value [<snip>] in field being converted to double, caught NumberFormatException <For input string: "headerName"> field discarded
我在load语句之后有一个过滤器,它试图确保我以后不会对任何标题行进行操作(通过过滤掉标题术语),但是我想摆脱警告噪音以避免掩盖任何潜在的问题(例如不能正确投射的实际数据字段)。
这可能吗?
答案 0 :(得分:3)
另一个选择,如果你不熟悉编写UDF,可能是这样的:
示例数据:
MyIntVal
123
456
脚本:
A = load 's3://blah/myFile' USING PigStorage() as (myintval: chararray);
B = filter A by myintval neq 'MyIntVal';
C = foreach B generate (int)$0;
这将过滤掉标题行,然后将剩余的值转换为int。
不是说这是最好的方法,但如果它适合你的情况,这是另一个非常简单的选择。
答案 1 :(得分:0)
您可以在提交Pig作业(如果可能)之前执行此操作,或尝试编写在满足某些条件时将发出空值的UDF,以便稍后您可以对其进行过滤。
答案 2 :(得分:0)
这可以帮助您获得结果: -
input_file = load 'input' using PigStorage(',') as (row1:chararay, row2:chararray);
ranked = rank input_file;
/* ranked:{rank_input_file:long, row1:chararay, row2:chararay} */
NoHeader = filter ranked by (rank_input_file > 1);
New_input_file = foreach NoHeader generate row1, row2;