如何过滤pig中的“nan”

z18hc3ub  于 2021-06-21  发布在  Pig
关注(0)|答案(3)|浏览(434)

我有一些数据行如下所示:
(1655,var0,var1,nan)
第一列是id,第二列和第三列来自关联。第四列是相关值(来自使用cor函数)。我想过滤这些行。
从apache pig文档中,我认为nan相当于null。因此,我在代码中添加了以下内容:

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

这显然不起作用,因为显然pig不以相同的方式处理null和nan。我想知道过滤nan的正确方法是什么,因为清管器文档中不清楚。
谢谢!

busg9geu

busg9geu1#

你可以把数据作为一个整体读进去 chararray 行和使用自定义项来分析行。我做了一个数据集,看起来像这样

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壳里

$ 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)
deyfvvtc

deyfvvtc2#

我采用了以下解决方案:

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

我重命名了列,并将数据类型从chararray重新分配为double。
我很感激您的回答,但由于我使用的ui(cloudera)的限制,我不能在原型制作过程中使用udf

mbjcgjjk

mbjcgjjk3#

最终,您可以在模式中将列指定为chararray,并使用 not matches 'NaN' 或者,如果您想用其他内容替换您的nan,您可以像前面一样将字符放在模式中,然后: Data = FOREACH Data GENERATE ..., (correlation matches 'NaN' ? 0 : (double) correlation), ... 我希望这能有所帮助,祝你好运;)

相关问题