Apache pig 如何过滤&x27;楠';猪

Apache pig 如何过滤&x27;楠';猪,apache-pig,nan,Apache Pig,Nan,我的数据中有一些行如下所示: (1655,var0,var1,NaN) 第一列是ID,第二列和第三列来自相关性。第四列是相关值(使用COR函数)。 我想筛选这些行 从ApachePig文档中,我的印象是NaN相当于null。因此,我在代码中添加了以下内容: filter_corr = filter correlation by (corr IS NOT NULL); 这显然不起作用,因为显然Pig不以相同的方式处理null和NaN。 我想知道过滤NaN的正确方法是什么,因为从Pig文档中还不清

我的数据中有一些行如下所示:

(1655,var0,var1,NaN)

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

从ApachePig文档中,我的印象是NaN相当于null。因此,我在代码中添加了以下内容:

filter_corr = filter correlation by (corr IS NOT NULL);
这显然不起作用,因为显然Pig不以相同的方式处理null和NaN。 我想知道过滤NaN的正确方法是什么,因为从Pig文档中还不清楚


谢谢

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

1665,var0,var1,NaN
1453,var2,var3,5.432
3452,var4,var5,7.654
8765,var6,var7,NaN
创建自定义项

#!/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)

最终,您可以在模式中将列指定为chararray,并使用
不匹配的'NaN'进行筛选。

或者,如果您想用其他内容替换您的NAN,您可以像前面一样在模式中添加字符,然后:

Data=FOREACH数据生成…,(相关性匹配“NaN”?0:(双重)相关性),…


我希望这能有所帮助,祝你好运;)

我选择了这个解决方案:

filter_corr = filter data by (corr != 'NaN');
data1 = foreach filter_corr generate ID, (double)corr as double_corr;
我重命名了列,并将数据类型从chararray重新分配为double


我很欣赏这些响应,但由于我使用的UI(Cloudera)中的限制,我无法在原型设计期间使用UDF。

NULL
通常意味着没有对象。如果在关系的第4列中有一个实际的
NaN
,pig会将其作为一个字母串来读取。尝试使用
filter correlation by corr==“NaN”
进行过滤,并查看它返回的内容。我通常通过将该列作为字符列读取来执行此操作。如果我在列被定义为int或double时检查字符串'NaN',我会得到一个错误。我希望找到一个更好的方法来完成这个中间步骤。我想问的是,你的第一列看起来像
(1655,var0,var1,NaN)
还是
(1655,var0,var1,)
?看起来像(1655,var0,var1,NaN)注:如果可以的话,你应该避免UDF,因为因为Pig看不到UDF中的内容,所以无法实现自动修剪:)这与我使用的内容非常接近,所以我将给你“接受”: