apachegiraph/hadoop:遍历自定义arraywritable

brqmpdu1  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(301)

我原以为这很容易实现,但现在开始很痛苦了。
我有一个数组可写的子类如下:

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

一个可写的子类,比如:

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()) 它告诉我,对于每个不适用于类型object的对象(required:array或java.lang.iterable,found:object)。
把那行改成 for(VertexDistanceWritable distEntry : message.get() ) ,这让我 error: incompatible types -- required: VertexDistanceWritable, found: Writable . 这是最奇怪的问题--vertexdistancewritable扩展了writable,这不是很好吗?
为vertexdistancewritable编写我自己的自定义“get\u foo()”函数,该函数以vertexdistancewritable[]的形式返回值。当然,值是私有的,根据文档除了get()之外没有getter函数,我已经遇到了一些问题
我只想要一种方法来迭代我的vertexdistancearraywritable类。这在hadoop中可能吗?一定是的,对吧?我应该可以迭代数组中的一堆元素,不是吗?这看起来像是相当糟糕的基本东西。

wfsdck30

wfsdck301#

经过30分钟的实验和搜索,我发现了一个线索。有点俗气,但似乎编译正确。基本上只是使用一个可写的,然后把它转换成我的自定义可写。

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

我还没有确认它是否工作正常,我会更新和确认我的答案时,我可以确保它的工作。
编辑:有效。可能需要一个复制构造函数,因为我有一个用于vertexdistancewritable的构造函数,但从未 checkout 它。

相关问题