能够Awk何必Spark

Posted 早起的码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了能够Awk何必Spark相关的知识,希望对你有一定的参考价值。



       大数据近些年算是比较火,好多程序员可能为了学习技术,一个简单数据量很少的数据处理也要写个spark程序去集群上跑一跑。这样反而打包,发布,跑任务,拉结果工作效率极低。这就属于杀鸡用牛刀。

       试想一下,一个几十M的日志文本文件,几千几万行记录,真的有必要传到集群上一顿折腾吗?不妨让我们用最简单的工具来轻松快速的处理需求,这样不香吗?

       可能有的程序员要说了,我本地处理也需要写代码编译,执行,其实效率也不高,那我今天给你介绍一款linux工具--AWK.可能你听过,但你大概率没有深入应用。记得10年前我们的数据分析系统就是用shell和awk完成的数据统计工作。当然那时候数据量也不大,linux单机服务器可以处理的过来。


一 Awk的基本用法

awk [-F‘,’] [-v a=b] ‘BEGIN{}{}END{}’ a.txt

awk -f run.awk a.txt

二 Awk命令的几个内置变量

  •  NR,表示awk开始执行程序后所读取的数据行数.

  •  FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计

  •  NF,字段总数

  •  RS, 记录结束分隔符,默认分隔符为

  •  ORS,记录输出分隔符,默认为

  •  OFS,列字段输出分隔

  •  FS,  字段分隔符相当于-F

  •  RT, 指定的那个分隔符

  •  FILENAME,读取文件名

三 Awk内置函数

  • split(string, array, field separator) 切分

  • substr(s,p,n) 截取

  • length(val)求长度

  • gsub(r,s,t):函数则使得在所有正则表达式被匹配的时候都发生替换。

  • tolower(String ) 转化小写

  • int(x ) 返回 x的截断至整数的值,求整

  • 较新版本,自定义函数

     function 函数名(参数表){ 

           函数体   } 

四 Awk数据分析

1.分组求和

 样例数据:data.txt

能够Awk何必Spark


awk -F',' '{if ($1 in rs){rs[$1] += 1 } else{rs[$1]=1}}END{for (x in rs) 

          {print x,rs[x]}}'data.txt


能够Awk何必Spark

2.分组排重1

 

awk -F',' 'BEGIN{OFS=","}{keystr=$1","$2; if(keystrin rs){ rs[keystr]+=1}

else{rs[keystr]=1}}END{for (x in rs){split(x,items,",");key=items[1];

if(key in uv){uv[key]+=1;pv[key] +=rs[x]}else{uv[key]=1;pv[key]=rs[x]}}

for(x in uv){print x,uv[x],pv[x]}}'  data.txt


能够Awk何必Spark

3.分组排重2

 

awk -F',' '{keystr=$1" "$2;if(keystr in rs){ rs[keystr]+=1}

else{rs[keystr]=1}}END{for (x in rs) {print x,rs[x]}}'data.txt 

|awk 'BEGIN{OFS=","}{if($1 in uv) {uv[$1]+=1;pv[$1] +=$3} else{uv[$1]=1;pv[$1]=$3}}END{for(xin uv){print x,uv[x],pv[x]}}'

能够Awk何必Spark

效率比较 

生成文件data2.txt 

 633465行大小6.1M 0.5秒内完成,两种排重方法效率相当


能够Awk何必Spark

4.数据关联

样例数据:name.txt

能够Awk何必Spark

5.数据求和

 求出现数字之和


awk -v RS='[0-9]+' '{s+=RT}END{print s}'data.txt


6.排序

五 其他linux工具

此外Linux还有好多很实用的数据处理小工具,可以自己研究

  • join

  • comm 

  • diff

  • sed

  • sort

  • grep

  • cut

以上是关于能够Awk何必Spark的主要内容,如果未能解决你的问题,请参考以下文章

python+spark程序代码片段

Spark发现匹配字符串的出现次数

spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段

Spark闭包与序列化

Python中既有列表,何必再有数组(NumPy‘s ndarray)?

自适应何必媒体查询