Hbase&x2B;Hadoop';s MapReduce使用负值给出错误的和
我需要在Hbase&x2B;Hadoop';s MapReduce使用负值给出错误的和,hadoop,hbase,Hadoop,Hbase,我需要在HBase表上运行MapReduce,以对值进行求和。我遵循了《圣经》中的例子 属性最初是通过将字符串转换为字节数组来存储的(使用HBase的Bytes.toBytes(value)),但现在我需要将它们作为Double来求和。对于只有正值的列,它给出了正确的和,但我有一个列也有一些负值(在下面的代码中称为diferencea) 当我运行这个作业时,它给了我一个错误的答案,我注意到它就像Reduce任务是获取数字的模块,或者类似的东西。但是当我调试时,我看到解析的双对象valor正确地为
HBase
表上运行MapReduce,以对值进行求和。我遵循了《圣经》中的例子
属性最初是通过将字符串转换为字节数组来存储的(使用HBase的Bytes.toBytes(value)
),但现在我需要将它们作为Double
来求和。对于只有正值的列,它给出了正确的和,但我有一个列也有一些负值(在下面的代码中称为diferencea
)
当我运行这个作业时,它给了我一个错误的答案,我注意到它就像Reduce任务是获取数字的模块,或者类似的东西。但是当我调试时,我看到解析的双对象valor
正确地为负值。我不知道这是什么原因
工作设置:
job = new Job(hTable.getConfiguration(), "All");
job.setJarByClass(HBaseQuery.class);
scan.setCaching(500);
scan.setCacheBlocks(false);
TableMapReduceUtil.initTableMapperJob(
tabela, // input table
scan,
CalculoTotaisMapper.class, // mapper class
Text.class, // mapper output key
DoubleWritable.class, // mapper output value
job);
TableMapReduceUtil.initTableReducerJob(
tabela, // output table
CalculoTotaisReducer.class, // reducer class
job);
job.setNumReduceTasks(1); // at least one, adjust as required
boolean b = job.waitForCompletion(true);
我的地图绘制者:
public class CalculoTotaisMapper extends TableMapper<Text, DoubleWritable> {
public static final String[] ATTRS =
new String[]{"valortotalprestador", "valortotalconvenio", "diferenca"};
private Text text = new Text();
private Logger logger = LoggerFactory.getLogger(CalculoTotaisMapper.class);
public void map(ImmutableBytesWritable row, Result value, Context context)
throws IOException, InterruptedException {
Double val = 0.0;
for (String attr : ATTRS) {
byte[] valueBytes = value.getValue("hc".getBytes(), attr.getBytes());
String valueString = Bytes.toString(valueBytes);
val = Double.parseDouble(valueString);
text.set(attr);
context.write(text, new DoubleWritable(val));
}
}
}
公共类CalculoTotaisMapper扩展了TableMapper{
公共静态最终字符串[]属性=
新字符串[]{“valortotalprestador”、“valortotalconvernio”、“diference”};
私有文本=新文本();
私有记录器Logger=LoggerFactory.getLogger(CalculoTotaisMapper.class);
公共void映射(ImmutableBytesWritable行、结果值、上下文)
抛出IOException、InterruptedException{
双val=0.0;
for(字符串属性:属性){
byte[]valueBytes=value.getValue(“hc.getBytes(),attr.getBytes());
字符串valueString=Bytes.toString(valueBytes);
val=Double.parseDouble(valueString);
text.set(attr);
write(文本,新的双写(val));
}
}
}
我的减速机:
public class CalculoTotaisReducer extends TableReducer <Text, DoubleWritable,
ImmutableBytesWritable> {
public static final byte[] CF = "qu".getBytes();
public void reduce(Text key, Iterable<DoubleWritable> values,
Context context) throws IOException, InterruptedException {
double i = 0.0;
for (DoubleWritable val : values) {
double valor = val.get();
i += valor;
}
Put put = new Put(Bytes.toBytes("all"));
put.add(CF, key.getBytes(), Bytes.toBytes(i));
context.write(null, put);
}
}
公共类CalculoTotaisReducer扩展了TableReducer{
公共静态最终字节[]CF=“qu”.getBytes();
public void reduce(文本键、Iterable值、,
上下文)抛出IOException、InterruptedException{
双i=0.0;
for(可双写val:值){
double valor=val.get();
i+=勇气;
}
Put Put=新的Put(字节数。toBytes(“全部”));
add(CF,key.getBytes(),Bytes.toBytes(i));
write(null,put);
}
}
您的表包含负值,作业将正确读取。那么总数实际上也是正确的。还是要求绝对值的和?尝试i+=Math.abs(valor)
。作业正在进行求和,就好像它正在使用Math.abs
,但我确实希望作业以正常方式求和,按原样求和负值。