我的数据有一些看起来像这样的行:
(1655,var0,VAR1,NAN)
第一列是ID,第二列和第三列来自相关性。第四列是相关值(来自使用COR函数)。 我想过滤这些行。
从Apache Pig文档中,我的印象是NaN相当于null。因此我将其添加到我的代码中:
filter_corr = filter correlation by (corr IS NOT NULL);
这显然不起作用,因为显然猪不会以同样的方式对待null和NaN。 我想知道过滤NaN的正确方法是什么,因为从Pig文档中不清楚。
谢谢!
答案 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