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