Giraph最好的顶点输入格式,类型为String的ID的输入文件(Giraph best'

2019-10-24 07:43发布

我有一个多节点集群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.JsonLongDoubleFloatDoubleVertexInputFormatorg.apache.giraph.io.formats.TextDoubleDoubleAdjacencyListVertexInputFormat ,我不能得到这个工作。

这个问题解决了,我能适应原最短路径算法示例,并让它为我的文件工作,但直到我得到一个解决方案为了这个,我不能达到这一点。

如果这种格式它不是一个很好的决定,我也许可以适应它,但我不知道它是我最好的选择,我从giraph文字输入和输出格式这是非常糟糕的知识,这就是为什么i0me这里寻求建议。

Answer 1:

最好是写自己的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);
    }

  }
}


Answer 2:

我解决了这个调整我自己的文件,以适应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
标签: hadoop giraph