编码之前的操作
我的项目是以Maven Project创建的,里面会涉及到GroupID和ArtifactID,简单解释一下:
为了测试方便,我的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是做累加的。于是,我们发现该功能就是自定义的一个计数器方法。
待更新...