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;