java - Hadoop:基元数组作为键值对中的值

标签 java arrays hadoop key-value writable

我在之前的帖子中问过一个非常相似的问题 Hadoop: How can i have an array of doubles as a value in a key-value pair? .

我的问题是我想将一个 double 组作为值从 map 传递到 reduce 阶段。我得到的答案是序列化,转换为文本,将其传递给 reducer 并反序列化。这是一个很好的解决方案,但它就像序列化和反序列化两次一样。

ArrayWritable 只接受实现 Writable 的类型,例如 FloatWritable。所以另一种解决方案是将我的 double 组转换为 DoubleWritables 数组。但这也需要一些时间,而且 Writables 是一种非常昂贵的资源。难道没有像 ArrayWritable array=new ArrayWritable(Double.class) 这样非常简单的解决方案吗???

最佳答案

只需实现您自己的 Writable界面。

例如,

public class DoubleArrayWritable implements Writable {
    private double[] data;

    public DoubleArrayWritable() {

    }

    public DoubleArrayWritable(double[] data) {
        this.data = data;
    }

    public double[] getData() {
        return data;
    }

    public void setData(double[] data) {
        this.data = data;
    }

    public void write(DataOutput out) throws IOException {
        int length = 0;
        if(data != null) {
            length = data.length;
        }

        out.writeInt(length);

        for(int i = 0; i < length; i++) {
            out.writeDouble(data[i]);
        }
    }

    public void readFields(DataInput in) throws IOException {
        int length = in.readInt();

        data = new double[length];

        for(int i = 0; i < length; i++) {
            data[i] = in.readDouble();
        }
    }
}

关于java - Hadoop:基元数组作为键值对中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12878375/

相关文章:

java - 调用 onWindowFocusChange() 后更改文本

java - 如何将 logback 操作记录到文件中?

javascript - 如何使用 json 数据在 javascript 中创建二维数组

java - Java中查找数组中元素的出现次数

javascript - JS 如何对数组的索引进行归约求和?

hadoop - 在创建需要动态配对的 Hive 表时,是否有任何列顺序?

java - 有没有办法在j2me程序中显示web组件?我正在为 s40 系列诺基亚手机编程

java - 将拓扑提交到远程集群时,不会调用 spout 的 open() 方法

perl - 为什么 Hadoop Streaming 找不到我的脚本?

hadoop - 谁访问了 Hive 表或 HDFS 目录