【发布时间】: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