【问题标题】:Apache Giraph/Hadoop: Iterating through custom ArrayWritableApache Giraph/Hadoop:迭代自定义 ArrayWritable
【发布时间】:2016-09-25 10:04:53
【问题描述】:

我认为这很容易实现,但它开始变得很痛苦。

我有一个像这样的 ArrayWritable 子类:

public class VertexDistanceArrayWritable extends ArrayWritable {
    public VertexDistanceArrayWritable() {
        super(VertexDistanceWritable.class);
    }
    public VertexDistanceArrayWritable(VertexDistanceWritable[] v) {
        super(VertexDistanceWritable.class, v);
    }
}

还有一个像这样的 Writable 子类:

public class VertexDistanceWritable implements Writable {

    //Implements write, readFields, and some custom functions that aren't used yet

}

在我的 Giraph 计算函数中,消息是 VertexDistanceArrayWritable 的。我想遍历每个 VertexDistanceWritable 每条消息(VertexDistanceArrayWritable)。这是我的计算函数:

@Override
public void compute(Vertex<Text, MapWritable, FloatWritable> vertex,
    Iterable<VertexDistanceArrayWritable> messages) throws IOException {

    for(VertexDistanceArrayWritable message : messages) {
        for(VertexDistanceWritable distEntry : message) {
            //Do stuff with distEntry
        }
    }

    //do other stuff

    vertex.voteToHalt();
}

当我编译代码时,我得到这个错误:

for-each not applicable to expression type
    for(VertexDistanceWritable distEntry : message) {

  required: array or java.lang.Iterable
  found:    VertexDistanceArrayWritable

所以现在我有一个问题。我想遍历 arrayWritable 子类。

我尝试了以下方法:

  • 将该行更改为 for(VertexDistanceWritable distEntry : message.toArray()),这告诉我 for-each 不适用于类型 Object(必需:数组或 java.lang.Iterable,找到:Object)。

  • 将该行更改为for(VertexDistanceWritable distEntry : message.get() ),这给了我error: incompatible types -- required: VertexDistanceWritable, found: Writable这是最奇怪的问题——VertexDistanceWritable 扩展了 Writable,这不应该可以正常工作吗?

  • 为 VertexDistanceWritable 编写我自己的自定义“get_foo()”函数,该函数以 VertexDistanceWritable[] 的形式返回值。当然,值是私有的,根据the documentation,除了我已经遇到问题的 get() 之外没有 getter 函数

我只是想要一种方法来迭代我的 VertexDistanceArrayWritable 类。这在 Hadoop 中是否可能?它必须是,对吧?我应该能够遍历我在数组中创建的一堆元素,不是吗?这似乎是非常基本的东西。

【问题讨论】:

    标签: java hadoop iterator giraph writable


    【解决方案1】:

    经过大约 30 分钟的实验和谷歌搜索,我发现了一条线索here。有点俗气,但似乎编译正确。基本上只需使用 Writable 然后将其转换为我的自定义可写。

    for(VertexDistanceArrayWritable message : messages) {
        for(Writable distWritable : message.get()) {
            vertexDistanceWritable distEntry = (VertexDistanceWritable) distWritable;
            //do other stuff
        }
    }
    

    我还没有确认它是否正常工作,当我可以确保它正常工作时,我会更新并确认我的答案。

    编辑:它有效。可能需要一个复制构造函数,因为我有一个用于 VertexDistanceWritable,但从未检查过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2017-08-27
      • 2017-01-07
      • 2012-10-10
      • 2014-08-28
      • 2016-02-17
      相关资源
      最近更新 更多