5

我正在尝试通过 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 语句之后有一个过滤器,它试图确保我以后不会对任何标题行进行操作(通过过滤掉标题术语),但我想摆脱警告噪音以避免掩盖任何潜在的问题(例如未正确转换的实际数据字段)。

这可能吗?

4

3 回答 3

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。

并不是说这是最好的方法,但如果它适合您的情况,这是另一种非常简单的选择。

于 2013-04-25T18:50:51.240 回答
0

您可以在提交 Pig 作业之前执行此操作(如果可能),或者尝试编写在满足某些条件时会发出空值的 UDF,以便稍后您可以将其过滤掉。

于 2011-04-07T11:37:21.437 回答
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;
于 2015-07-02T17:35:21.377 回答