关于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是做累加的。于是,我们发现该功能就是自定义的一个计数器方法。

待更新...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值