gpt4 book ai didi

java - Apache Giraph/Hadoop : Iterating through custom ArrayWritable

转载 作者:行者123 更新时间:2023-12-02 21:20:35 26 4
gpt4 key购买 nike

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

我有一个像这样的 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(必需:array 或 java.lang.Iterable,找到:Object)。
  • 将该行更改为 for(VertexDistanceWritable distEntry : message.get() ) ,这给了我error: incompatible types -- required: VertexDistanceWritable, found: Writable . 这是最奇怪的问题—— VertexDistanceWritable 扩展了 Writable,这不应该正常工作吗?
  • 为 VertexDistanceWritable 编写我自己的自定义“get_foo()”函数,它以 VertexDistanceWritable[] 的形式返回值。当然,values 是私有(private)的,根据 the documentation 没有 getter 函数。除了 get() 我已经遇到了
  • 的问题

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

    最佳答案

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

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

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

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

    关于java - Apache Giraph/Hadoop : Iterating through custom ArrayWritable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37477154/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com