关于WordCount代码中的一些疑问解答

编码之前的操作

我的项目是以Maven Project创建的,里面会涉及到GroupID和ArtifactID,简单解释一下:

  • GroupID是项目组织唯一的标识符, 比如我的项目叫test 那么GroupID应该是 com.yever.test  域名.公司名.项目名
  • ArtifactID就是项目的唯一的标识符, 一般是 项目名-xxx   比如test-model

为了测试方便,我的GroupID为test、ArtifactID为wordCount。

正文开始

最近在复现wordcount代码的时候,发现单词的分割不是用的split,而是用的StringTokenizer,我就在思考为啥会用这样的方式来分割,难道真的要比split要好?我百度搜了一下问题,发现好多人也对这个问题提出了疑问和解答。

于是,把精炼的答案先贴出来

//split方法
String flt ="'|and|exec|insert|select|delete|update|count|*|%|master|truncate|declare|;|,"; 
String filter[] = flt.split("//|"); 

//StringTokenizer方法
String flt ="'|and|exec|insert|select|delete|update|count|*|%|master|truncate|declare|;|,";
StringTokenizer st = new StringTokenizer(flt , "|");
int i=0;
while(st.hasMoreTokens())
    {filter[i]=st.nextToken();i++;}

split需要转码,因为split接收的是正则,split(String regex) ,根据给定的正则表达式的匹配来拆分此字符串。
stringtokenizer直接使用就可以了,StringTokenizer(String str) ,为指定字符串构造一个 string tokenizer。

而且,从各个问题帖子的分析来看,两者在时间上也有差异。更多的帖子中显示StringTokenizer的耗时更少,split的耗时较长。这个也证实了官方的文档中选用StringTokenizer方法的原因。

另一个问题,一直很疑惑input的kv键值对的key是什么,我们在代码中测试输出得到了以下的信息

protected void map(Object key, Text value, Context context)
        throws IOException, InterruptedException {
    System.out.println(key.toString());
    StringTokenizer itr = new StringTokenizer(value.toString());
    while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
    }
}

结果输出:

0
70
71
105
106
124
......

再分析一下读入的文件:

For the latest information about Hadoop, please visit our website at:

   http://hadoop.apache.org/core/

and our wiki, at:

......

不难发现,这就是字节偏移数。所以文件读进来采用的是object key。

题外话

在编写真实项目的时候,遇到了很多有趣的问题,也在如下做了记录。

1、context.getCounter("Time", "CombinerData_output").increment(end - start);这句话是干嘛的?

首先我们了解一下context.getCounter是什么。context.getCounter(String groupName,String counterName) 从原始的定义中我们了解到这是用来声明计数器的,而increment是做累加的。于是,我们发现该功能就是自定义的一个计数器方法。

待更新...

猜你喜欢

转载自blog.csdn.net/dylan_me/article/details/80931582