一、Linux命令实现单词计数并排序数组
cat 目标文件 | awk -F ' ' '{for(i=1;i<=NF;i++){print $i}}' | sort | uniq -c | sort -t ' ' -k1r | awk '{print $2 " " $1}' | more
解析:awk是一个很是强大的文本编辑命令,参数F是自定义的分隔符,这里的分隔符是空格,后面跟着awk的程序语言,其意思是打印每一行中的每一个单词。函数
sort排序。code
uniq命令去重,参数c是统计每行数据的频率,格式为:频率 空格 行内容。blog
sort排序,参数t是自定义分隔符,这里的分隔符是空格,参数k是按照某几列排序,根据前面uniq排的序得知频率在第一位,因此参数k的值为1,至于参数k跟着的值r是由于sort默认排序是升序,加上r是降序排列。排序
按照咱们的习惯,都是先打印单词,而后再打印频率,因此再次使用了awk调整打印顺序。class
二、使用MapReduce程序实现两个文件(文件1内容:用户ID,购车记录;文件2内容:用户ID,购房记录)join,要求:打印出同时购房购车的用户,并将其购车购房记录输出,说出思想便可。awk
解析:在Map端,将两份文件均分割,直接用上下文context写出,在写出时,在value中添加购车或者购房标记(车:car25000.00,房:house1800000.00)。原理
在Reduce端,因为在Map处理好的数据已经按照用户ID处理完毕,其values中保存着用户的购房或者购车记录。而后在reduce处理时,先遍历此集合,若是集合同时包含了car和house,则说明用户同时购买了车和房,则其实才将其输出;如若不知足上述条件,就不用Context输出。遍历
三、问题2的升级版,现得知用户购车记录文件相比购房记录很是小,因此在MapReduce程序中两个文件进行join时,Reduce端代价比较大,因此须要你提出一种新的处理方案。提示,容许一部分偏差。二进制
解析:采用布隆过滤器的思想,咱们先将购车记录的用户ID作成一个布隆过滤器(布隆过滤器的原理是:咱们建立一个很是长的二进制数组,而后将存在用户ID的数据按照某种函数转换成一个长度跟上述数组长度相等的二进制向量并放入数组中)。咱们在进行Map端操做的时候,对于每个购房的用户ID都通过一次布隆过滤器,这样就能够根据用户ID是否存在于布隆过滤器判断该用户是否在购车的同时购买了房,剔除掉没有同时购房购车的用户,并用上下文context写出。
在Reduce端,数据量就减少了,这样就可使Reduce端的压力减少。