34

使用Pig清洗数据

 5 years ago
source link: http://blog.52sox.com/use-pig-for-data-clean/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Pig是个不错的数据流语言,可以用于数据处理中的一些场景,比如日志分析。

在这里,我们假设有如下的数据:

num,name,age  
1,zhangsan,20  
2,lisi,30  
3,wangwu,25

现在,我们想提取其中年龄大于20岁且小于30岁的人的记录,然后按照年龄升序进行存储。

对于这个简单的需求,我们可以使用Pig的本地模式进行操作:

pig -x local

进入了grunt交互模式下,我们进行如下的操作:

grunt> patent = load 'patent.csv' using PigStorage(',') as (num,name,age);  
grunt> users = filter patent by age >= 20 and age <= 30;  
grunt> person = order users by age asc;  
grunt> store person into 'user' using PigStorage(',');

这个过程简单的说,类似如下的操作:

  • 使用load函数加载文件,然后使用逗号进行分割,之后得到对应的字段。对于字段,我们可以设置其转换的类型,当然如果不进行设置的话,就是默认的bytearray。
  • 我们调用filter对patent按照age进行过滤
  • 使用order对users结果集按照age进行升序排序
  • 使用store将person结果集保存在user目录下

这个过程,可以说是很简单和符合非编程操作人员的操作。在这个过程中,我们可以通过 dump person 在终端上打印其输出信息。

如果对应的目录存在,可以删除后再进行存储:

grunt> fs -rm -r -f user;

如果本地测试没有问题,那么我们将其编写在1个后缀为 .pig 的脚本中,其内容如下:

patent = load 'patent.csv' using PigStorage(',') as (num,name,age);  
users = filter patent by age > 20 and age <= 30;  
person = order users by age asc;  
store person into 'user' using PigStorage(',');

然后我们执行如下的命令进行运行:

dog@debian:~$ pig -f patent.pig

如果要进行语法的检验,可以使用 -c 选项:

dog@debian:~$ pig -c patent.pig

这样就是1个简单的Pig的处理过程。

参考文章:

https://www.ibm.com/developerworks/cn/linux/l-apachepigdataquery/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK