我有一个多节点集群giraph在我的电脑正常工作。 我从Giraph执行SimpleShortestPathExample并执行罚款。
该算法运行这个文件(tiny_graph.txt):
[0,0,[[1,1],[3,3]]]
[1,0,[[0,1],[2,2],[3,1]]]
[2,0,[[1,2],[4,4]]]
[3,0,[[0,3],[1,1],[4,4]]]
[4,0,[[3,4],[2,4]]]
这个文件有以下的输入格式:
[source_id,source_value,[[dest_id, edge_value],...]]
现在,我想执行这个相同的算法,在这同一个集群,但与原来不同的输入文件。 我自己的文件是这样的:
[Portada,0,[[Sugerencias para la cita del día,1]]]
[Proverbios españoles,0,[]]
[Neil Armstrong,0,[[Luna,1][ideal,1][verdad,1][Categoria:Ingenieros,2,[Categoria:Estadounidenses,2][Categoria:Astronautas,2]]]
[Categoria:Ingenieros,1,[[Neil Armstrong,2]]]
[Categoria:Estadounidenses,1,[[Neil Armstrong,2]]]
[Categoria:Astronautas,1,[[Neil Armstrong,2]]]
这是非常类似于原来的,但ID是字符串和顶点和边值长。 我的问题是我应该使用哪一个的TextInputFormat对于这一点,因为我已经有尝试org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat
和org.apache.giraph.io.formats.TextDoubleDoubleAdjacencyListVertexInputFormat
,我不能得到这个工作。
这个问题解决了,我能适应原最短路径算法示例,并让它为我的文件工作,但直到我得到一个解决方案为了这个,我不能达到这一点。
如果这种格式它不是一个很好的决定,我也许可以适应它,但我不知道它是我最好的选择,我从giraph文字输入和输出格式这是非常糟糕的知识,这就是为什么i0me这里寻求建议。
最好是写自己的inputformat。 我建议你的字符串使用散列码。 我写一个示例代码,使得每行包括:[vertex_id(您的字符串的整数例如哈希码),vertex_val(长),[[neighbor_id(整数),neighbor_val(长)],...]
public class JsonIntLongIntLongVertexInputFormat extends
TextVertexInputFormat<IntWritable, LongWritable, LongWritable> {
@Override
public TextVertexReader createVertexReader(InputSplit split,
TaskAttemptContext context) {
return new JsonIntLongIntLongVertexReader();
}
class JsonIntLongIntLongVertexReader extends
TextVertexReaderFromEachLineProcessedHandlingExceptions<JSONArray,
JSONException> {
@Override
protected JSONArray preprocessLine(Text line) throws JSONException {
return new JSONArray(line.toString());
}
@Override
protected IntWritable getId(JSONArray jsonVertex) throws JSONException,
IOException {
return new IntWritable(jsonVertex.getString(0).hashCode());
}
@Override
protected LongWritable getValue(JSONArray jsonVertex) throws
JSONException, IOException {
return new LongWritable(jsonVertex.getLong(1));
}
@Override
protected Iterable<Edge<IntWritable, LongWritable>> getEdges(
JSONArray jsonVertex) throws JSONException, IOException {
JSONArray jsonEdgeArray = jsonVertex.getJSONArray(2);
List<Edge<IntWritable, LongWritable>> edges =
Lists.newArrayListWithCapacity(jsonEdgeArray.length());
for (int i = 0; i < jsonEdgeArray.length(); ++i) {
JSONArray jsonEdge = jsonEdgeArray.getJSONArray(i);
edges.add(EdgeFactory.create(new IntWritable(jsonEdge.getString(0).hashCode()),
new LongWritable(jsonEdge.getLong(1))));
}
return edges;
}
@Override
protected Vertex<IntWritable, LongWritable, LongWritable>
handleException(Text line, JSONArray jsonVertex, JSONException e) {
throw new IllegalArgumentException(
"Couldn't get vertex from line " + line, e);
}
}
}
我解决了这个调整我自己的文件,以适应org.apache.giraph.io.formats.TextDoubleDoubleAdjacencyListVertexInputFormat
。 我原来的文件应该是这样的:
Portada 0.0 Sugerencias 1.0
Proverbios 0.0
Neil 0.0 Luna 1.0 ideal 1.0 verdad 1.0 Categoria:Ingenieros 2.0 Categoria:Estadounidenses 2.0 Categoria:Astronautas 2.0
Categoria:Ingenieros 1.0 Neil 2.0
Categoria:Estadounidenses 1.0 Neil 2.0
Categoria:Astronautas 1.0 Neil 2.0
数据之间的那些空间是选项卡的空间(“\ T”),因为这种格式具有选项作为原线劈裂成多个字符串预定令牌值。
感谢@马苏德 - sagharichian您的帮助反正! :d
文章来源: Giraph best's Vertex Input format, for an input file with ids of type String