我的问题是,如何制作计数器,可以在其中放入 double 之类的东西(是的,我确实使用了 LongValue,但这给了我 0)?
最佳答案
Hadoop MapReduce 作业计数器根据定义是 Java long
值。 MapReduce 作业实现可以通过 TaskAttemptContext
获取 Counter
的句柄。
获得计数器
的句柄后,作业可以将计数器增加增量或将其设置为特定值。
http://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapreduce/Counter.html#increment(long)
http://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/mapreduce/Counter.html#setValue(long)
请注意,方法签名均以long
形式指定。域模型不支持使用 double
或任何其他数据类型作为计数器值。
如果绝对有必要,那么您可以想出一些创造性的方法将数据类型编码为long
。实现此目的的一种方法是利用 long
和 double
都是 64 位宽这一事实。然后,您可以使用 Double#doubleToLongBits
将 double
值编码为 long
。
http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#doubleToLongBits(double)
但是,稍后理解这一点的唯一方法是编写自定义代码,在作业完成后解压该计数器值并将其传递给 Double#longBitsToDouble
。
http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#longBitsToDouble(long)
不过,这将是 Hadoop MapReduce 作业计数器的一种非常不寻常的用法。
关于Hadoop 计数器——如何使用不同类型的计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34403552/