如何过滤' NaN'在猪

时间:2014-07-08 16:42:19

标签: apache-pig nan

我的数据有一些看起来像这样的行:

(1655,var0,VAR1,NAN)

第一列是ID,第二列和第三列来自相关性。第四列是相关值(来自使用COR函数)。 我想过滤这些行。

从Apache Pig文档中,我的印象是NaN相当于null。因此我将其添加到我的代码中:

filter_corr = filter correlation by (corr IS NOT NULL);

这显然不起作用,因为显然猪不会以同样的方式对待null和NaN。 我想知道过滤NaN的正确方法是什么,因为从Pig文档中不清楚。

谢谢!

3 个答案:

答案 0 :(得分:1)

最后,您可以在您的架构中将列指定为chararray,并使用not matches 'NaN'

过滤

或者,如果你想用其他东西替换你的NaN,你可以像以前那样将chararray放在你的模式中,然后:

Data = FOREACH Data GENERATE ..., (correlation matches 'NaN' ? 0 : (double) correlation), ...

我希望这可以帮助,祝你好运;)

答案 1 :(得分:0)

您可以将数据读入一行chararray并使用udf来解析行。我创建了一个看起来像这样的数据集

1665,var0,var1,NaN
1453,var2,var3,5.432
3452,var4,var5,7.654
8765,var6,var7,NaN

创建UDF

#!/usr/bin/env python
# -*- coding: utf-8 -*-
### name of file: udf.py ###

@outputSchema("id:int, col2:chararray, col3:chararray, corr:float")
def format_input(line):
    parsed = line.split(',')
    if parsed[len(parsed) - 1] == 'NaN'
        parsed.pop()
        parsed.append(None)
    return tuple(parsed)

然后在猪壳中

$ pig -x local
grunt>

/* register udf */
register 'udf.py' using jython as udf;

data = load 'file' as (line:chararray);
A = foreach data generate FLATTEN(udf.format_input(line));
filtered = filter A by corr is not null;
dump filtered

输出

(1453,var2,var3,5.432)
(3452,var4,var5,7.654)

答案 2 :(得分:0)

我已经解决了这个问题:

filter_corr = filter data by (corr != 'NaN');
data1 = foreach filter_corr generate ID, (double)corr as double_corr;

我重命名了该列,并将数据类型从chararray重新分配为double。

我很欣赏这些回复,但由于我使用的用户界面的限制(Cloudera),我无法在原型设计中使用UDF