Hadoop ... Text.toString()转换问题

时间:2010-07-15 18:21:43

标签: text hadoop

我正在编写一个简单的程序,用于在我的项目的有向图中枚举三角形。首先,对于每个输入弧(例如ab,bc,ca,注意:标签符号用作分隔符)我希望我的地图函数输出以下对([a,to_b],[b,from_a],[a_b, - 1]):

 public void map(LongWritable key, Text value,
                OutputCollector<Text, Text> output,
                Reporter reporter) throws IOException {

  String line = value.toString();
  String [] tokens = line.split("    ");

  output.collect(new Text(tokens[0]), new Text("to_"+tokens[1]));
  output.collect(new Text(tokens[1]), new Text("from_"+tokens[0]));
  output.collect(new Text(tokens[0]+"_"+tokens[1]), new Text("-1"));

}

现在我的reduce函数应该交叉连接所有同时具有to_和from_的对 并简单地发出其键包含“_”的任何其他对。

      public void reduce(Text key, Iterator<Text> values,
                   OutputCollector<Text, Text> output,
                   Reporter reporter) throws IOException {

  String key_s = key.toString();

  if (key_s.indexOf("_")>0)
      output.collect(key, new Text("completed"));

   else {

           HashMap <String, ArrayList<String>> lists = new HashMap <String, ArrayList<String>> ();    

          while (values.hasNext()) {

              String line = values.next().toString();

              String[] tokens = line.split("_");
              if (!lists.containsKey(tokens[0])) {
                   lists.put(tokens[0], new ArrayList<String>());
              }
           lists.get(tokens[0]).add(tokens[1]);     
          }

          for (String t : lists.get("to"))
               for (String f : lists.get("from"))
                  output.collect(new Text(t+"_"+f), key); 


  }

} 

这是最激动人心的事情发生的地方。 tokens [1]产生一个ArrayOutOfBounds异常。如果向上滚动,你可以看到迭代器应该给出“to_a”,“from_b”,“to_b”等值...当我输出这些值时,一切看起来都没问题,我有“to_a” ,“from_b”。但是split()根本不起作用,而且line.length()总是1而indexOf(“”)返回-1!完全相同的indexOf WORKS PERFECTLY for keys ...其中我们有对,其键包含“”并且看起来像“a_b”,“b_c”

我真的很困惑这一切。 MapReduce应该拯救生命,使一切变得简单。相反,我花了几个小时来本地化这个......

我真的很感谢你的帮助,伙计们! 提前谢谢!

1 个答案:

答案 0 :(得分:0)

尝试更改此信息时,请确定是否存在问题:

  String [] tokens = line.split("    ");

到此:

  String [] tokens = line.split("\t");