0

阅读 Apache Crunch 示例,该示例主要是 Java 并且对两者都很陌生。(我知道.NET)所以这里是示例代码:

DoFn<String, Pair<String, Long>> extractIPResponseSize = new DoFn<String, Pair<String, Long>>() {
  transient Pattern pattern;
  public void initialize() {
    pattern = Pattern.compile(logRegex);
  }
  public void process(String line, Emitter<Pair<String, Long>> emitter) {
    Matcher matcher = pattern.matcher(line);
    if(matcher.matches()) {
      try {
        Long responseSize = Long.parseLong(matcher.group(7));
        String remoteAddr = matcher.group(1);
        emitter.emit(Pair.of(remoteAddr, responseSize));
      } catch (NumberFormatException e) {
        // corrupt line, we should increment a counter
      }
    }
  }
};

第一行让我很困惑,我无法理解,你能逐条解释吗?注意:DoFn是 Apache Crunch 中的一个类,这里​​是它的文档: http ://crunch.apache.org/apidocs/0.3.0/org/apache/crunch/DoFn.html

我也做了一些谷歌搜索,看起来Pair这里也是一个 Apache 常见的语言:http: //commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/tuple/对.html

也许我需要了解的是 Java 泛型?

4

1 回答 1

1

DoFn是一个泛型类。也就是说,它的每个实例都包含类型参数。类型参数在方法中使用,但由编译器替换为Object引用。有关泛型的更多信息,请参阅Wikibooks

至于那行之后的左大括号,这是一个微妙的提醒,这实际上是一个正在声明的内部类。DoFn它是覆盖initializeandprocess方法的匿名子类。有关内部类的更多信息,请再次参阅Wikibooks

于 2013-07-22T19:55:09.130 回答