Apache pig 书包里的数学

Apache pig 书包里的数学,apache-pig,Apache Pig,我有很多元组,每个元组中有一个字段需要标准化为零。我在包上取该字段的MIN,然后从每个元组中减去该MIN 是否可以在不展平的情况下执行此操作 实际情况稍微复杂一些,因为我只想要满足特定条件的元组子集上的最小值 以下是一些不起作用的示例代码: data = LOAD 'data.csv' USING PigStorage(',') AS (x:int, y:int, z:int); data_grouped = GROUP data BY x; data_normal = FOREAC

我有很多元组,每个元组中有一个字段需要标准化为零。我在包上取该字段的
MIN
,然后从每个元组中减去该MIN

是否可以在不展平的情况下执行此操作

实际情况稍微复杂一些,因为我只想要满足特定条件的元组子集上的最小值

以下是一些不起作用的示例代码:

data = LOAD 'data.csv' USING PigStorage(',')
    AS (x:int, y:int, z:int);

data_grouped = GROUP data BY x;

data_normal = FOREACH data_grouped {
    good_data = FILTER data BY y == 0;
    smallest_good_z = MIN(good_data.z);
    GENERATE data.(x, y, z-smallest_good_z);
}

DESCRIBE data_normal;

rmf data_normal
STORE data_normal INTO 'data_normal' USING PigStorage(',');
和一个示例
data.csv

0,0,1
0,0,2
0,0,3
0,1,0
0,2,-1
1,2,3
1,3,4
1,4,5
1,0,5
请告诉我,我不必分组、
MIN
、展平、减法和重新分组!以下是我现在使用的方法,我想避开:

data = LOAD 'data.csv' USING PigStorage(',') AS
    (x:int, y:int, z:int);

data_grouped = GROUP data BY x;

data_n0 = FOREACH data_grouped {
    good_data = FILTER data BY y == 0;
    smallest_good_z = MIN(good_data.z);
    GENERATE FLATTEN(data.(x, y, z)), smallest_good_z AS smz:int;
}

data_n1 = FOREACH data_n0 GENERATE x,y,z-smz;

data_normal = GROUP data_n1 BY x;

不幸的是,你只能用UDF来做。以下是一个例子:

import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.DataBag;
import org.apache.pig.data.Tuple;

public class MinusToAllInBag extends EvalFunc<Tuple> {

    @Override
    public Tuple exec(Tuple input) throws IOException {
        if (input == null || input.size() != 3) {
            System.err.println("Inputs are ({inputBag}, position, toSubtract)");
            return null;
        }
        try {
            Object o = input.get(0);
            if (!(o instanceof DataBag)) {
                throw new RuntimeException("parameter 1 must be a databag");
            }
            DataBag inputBag = (DataBag)o;
            Integer pos = (Integer) input.get(1);
            Float toSubtract = (Float) input.get(2);
            for (Tuple row : inputBag) {
                Float value = (Float)row.get(pos);
                if (value != null) {
                    value -= toSubtract;
                    row.set(pos, value);
                }
            }
            return input;
        } catch (Exception e) {
            System.err.println("Failed to process input; error - " + e.getMessage());
            return null;
        }
    }
}

哦,在问题的标题中有一个猫的双关语DCUDF方法是否可以扩展到不知道元组大小的元组包?换句话说,总是从任何元组的第n个位置减去一个值,不管它有n个字段还是n+1000个字段?在我的情况下,我真的无法保留一个UDF,每次我向元组中添加字段时都需要对其进行编辑。是的,这是UDF的第二个参数,第一个参数是BAG,BAG元组中以0开头的pos,要减去的数字。此时,所有数字都必须是浮动的。如示例所示,如果从1开始计算,则“MinusToAllInBag(数据,2,(浮点)最小值_good_z)”中的索引2是第三列。
REGISTER libs.jar;

data = LOAD 'data.csv' USING PigStorage(',') AS
    (x:int, y:int, z:float);

data_grouped = GROUP data BY x;

data_n0 = FOREACH data_grouped {
    good_data = FILTER data BY y == 0;
    smallest_good_z = MIN(good_data.z);
    GENERATE group, MinusToAllInBag(data, 2, (float)smallest_good_z);
}

dump data_n0;