Pig的一个简单数据处理例子
2013-04-20 15:56
274 查看
1、Pig数据模型
Bag:表
Tuple:行,记录
Field:属性
Pig不要求同一个Bag里面的各个Tuple有相同数量或相同类型的Field
2、Pig Lating常用语句
1)LOAD:指出载入数据的方法
2)FOREACH:逐行扫描进行某种处理
3)FILTER:过滤行
4)DUMP:把结果显示到屏幕
5)STORE:把结果保存到文件
3、简单例子:
假如有一份成绩单,有学号、语文成绩、数学成绩,属性之间用|分隔,如下:
1)把文件从本地系统上传到Hadoop
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -put /home/coder/score.txt in[/code]
查看是否上传成功:
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls /user/coder/in
Found 1 items
-rw-r--r-- 2 coder supergroup 75 2013-04-20 14:33 /user/coder/in/score.txt[/code]
2)载入原始数据,使用LOAD
输入文件是:'hdfs://h1:9000/user/coder/in/score.txt'
表名(Bag):scores
从输入文件读取数据(Tuple)时以 | 分隔
读取的Tuple包含3个属性,分别为学号(num)、语文成绩(Chinese)和数学成绩(Math),这三个属性的数据类型都为int
3)查看表的结构
4)假如我们需要过滤掉学号为20130005的记录
查看过滤后的记录
5)计算每个人的总分
查看结果:
6)将每个人的总分结果输出到文件
查看结果:
[coder@h1 ~]$ hadoop dfs -ls /user/coder/out/result
Found 2 items
drwxr-xr-x - coder supergroup 0 2013-04-20 15:54 /user/coder/out/result/_logs
-rw-r--r-- 2 coder supergroup 65 2013-04-20 15:54 /user/coder/out/result/part-m-00000
[coder@h1 ~]$ ^C
[coder@h1 ~]$ hadoop dfs -cat /user/coder/out/result/*
20130001|170
20130002|181
20130003|130
20130004|160
20130005|163
cat: Source must be a file.
[coder@h1 ~]$ [/code]
再看一个小例子:
有一批如下格式的文件:
每行记录有三个字段:账号、密码、邮箱,字段之间以#号分隔,现在要提取这批文件中的邮箱。
1)上传文件到hadoop
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -put data.txt in[/code]
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls /user/coder/in
Found 1 items
-rw-r--r-- 2 coder supergroup 122 2013-04-24 20:34 /user/coder/in/data.txt
[coder@h1 hadoop-0.20.2]$ [/code]
2)载入原始数据文件
3)取出email字段
4)把结果输出到文件
5)查看结果
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -cat /user/coder/out/email/*
zhangsan@qq.com
lisi@126.com
wangwu@163.com
zhouliu@139.com
cat: Source must be a file.[/code]
Bag:表
Tuple:行,记录
Field:属性
Pig不要求同一个Bag里面的各个Tuple有相同数量或相同类型的Field
2、Pig Lating常用语句
1)LOAD:指出载入数据的方法
2)FOREACH:逐行扫描进行某种处理
3)FILTER:过滤行
4)DUMP:把结果显示到屏幕
5)STORE:把结果保存到文件
3、简单例子:
假如有一份成绩单,有学号、语文成绩、数学成绩,属性之间用|分隔,如下:
20130001|80|90 20130002|85|96 20130003|60|70 20130004|74|86 20130005|65|98
1)把文件从本地系统上传到Hadoop
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -put /home/coder/score.txt in[/code]
查看是否上传成功:
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls /user/coder/in
Found 1 items
-rw-r--r-- 2 coder supergroup 75 2013-04-20 14:33 /user/coder/in/score.txt[/code]
2)载入原始数据,使用LOAD
grunt> scores = LOAD 'hdfs://h1:9000/user/coder/in/score.txt' USING PigStorage('|') AS (num:int,Chinese:int,Math:int);
输入文件是:'hdfs://h1:9000/user/coder/in/score.txt'
表名(Bag):scores
从输入文件读取数据(Tuple)时以 | 分隔
读取的Tuple包含3个属性,分别为学号(num)、语文成绩(Chinese)和数学成绩(Math),这三个属性的数据类型都为int
3)查看表的结构
grunt> DESCRIBE scores; scores: {num: int,Chinese: int,Math: int}
4)假如我们需要过滤掉学号为20130005的记录
grunt> filter_scores = FILTER scores BY num != 20130005;
查看过滤后的记录
grunt> dump filter_scores; (20130001,80,90) (20130002,85,96) (20130003,60,70) (20130004,74,86)
5)计算每个人的总分
grunt> totalScore = FOREACH scores GENERATE num,Chinese+Math;
查看结果:
grunt> dump totalScore;
(20130001,170) (20130002,181) (20130003,130) (20130004,160) (20130005,163)
6)将每个人的总分结果输出到文件
grunt> store totalScore into 'hdfs://h1:9000/user/coder/out/result' using PigStorage('|');
查看结果:
[coder@h1 ~]$ hadoop dfs -ls /user/coder/out/result
Found 2 items
drwxr-xr-x - coder supergroup 0 2013-04-20 15:54 /user/coder/out/result/_logs
-rw-r--r-- 2 coder supergroup 65 2013-04-20 15:54 /user/coder/out/result/part-m-00000
[coder@h1 ~]$ ^C
[coder@h1 ~]$ hadoop dfs -cat /user/coder/out/result/*
20130001|170
20130002|181
20130003|130
20130004|160
20130005|163
cat: Source must be a file.
[coder@h1 ~]$ [/code]
再看一个小例子:
有一批如下格式的文件:
zhangsan#123456#zhangsan@qq.com lisi#434dfdds#lisi@126.com wangwu#ffere233#wangwu@163.com zhouliu#fgrtr43#zhouliu@139.com
每行记录有三个字段:账号、密码、邮箱,字段之间以#号分隔,现在要提取这批文件中的邮箱。
1)上传文件到hadoop
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -put data.txt in[/code]
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls /user/coder/in
Found 1 items
-rw-r--r-- 2 coder supergroup 122 2013-04-24 20:34 /user/coder/in/data.txt
[coder@h1 hadoop-0.20.2]$ [/code]
2)载入原始数据文件
grunt> T_A = LOAD '/user/coder/in/data.txt' using PigStorage('#') as (username:chararray,password:chararray,email:chararray);
3)取出email字段
grunt> T_B = FOREACH T_A GENERATE email;
4)把结果输出到文件
grunt> STORE T_B INTO '/user/coder/out/email'
5)查看结果
[coder@h1 hadoop-0.20.2]$ bin/hadoop dfs -cat /user/coder/out/email/*
zhangsan@qq.com
lisi@126.com
wangwu@163.com
zhouliu@139.com
cat: Source must be a file.[/code]
相关文章推荐
- 一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。
- 【转载】Coolite一个简单例子-GridPanel列表增删改预览及在线编辑器
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
- 使用jquery flip插件的一个简单例子
- 如何设计Java框架----一个简单的例子【翻译】
- 图灵机器人(智能云交互API)的一个java实现简单例子
- 记录一个简单innerHTML例子
- R语言S4类应用的一个简单例子
- 一个简单的XML文档例子
- QThread一个最简单的挂起,恢复的例子
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
- 利用JDOM把JPG图象数据写入XML一个简单例子
- 一个简单的Cucumber+Capybara的BDD开发例子
- java一个最简单的反射的例子
- 一个简单的 SWING 例子
- 一个Go语言接口和多操作系统实现的简单例子
- 【转载】关于:读写xls文件,提供下载的一个小例子(jxl 的简单运用) - 读取文件
- 一个简单的例子让你理解值传递和引用传递
- 使用rpcgen构建分布式程序的一个简单例子
- HttpInvokerProxyFactoryBean一个简单例子