我认为这很容易实现,但它开始变得很痛苦。
我有一个像这样的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计算功能中,Messages是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,found: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中甚至可能吗?它必须是,对吧?我应该能够迭代我在数组中制作的一堆元素,不是吗?这似乎是非常基本的东西。
答案 0 :(得分:0)
经过大约30分钟的实验和谷歌搜索,我发现了一条线索here。俗气的,但似乎编译正确。基本上只需使用Writable然后将其转换为我的自定义可写。
for(VertexDistanceArrayWritable message : messages) {
for(Writable distWritable : message.get()) {
vertexDistanceWritable distEntry = (VertexDistanceWritable) distWritable;
//do other stuff
}
}
我还没有确认它是否正常工作,当我确定它有效时,我会更新并确认我的答案。
编辑:它有效。可能需要一个复制构造函数,因为我有一个用于VertexDistanceWritable,但从未检查过。