前提:安装的是完全分布式的Hadoop,启动hadoop,然后启动Pig
根据Hadoop权威指南实例实现计算每年的最高温度。
1、第一步,创建temperature.txt的文档记录每年的温度
2、将temperature.txt文件放到HDFS 文件上去,具体操作如下:
3、输入pig,进入shell编辑模式下。
4、查看temperature是否在in的目录下,ls in查看temperature.txt文件是否传入。
grunt有默认路径,通过ls就可以查看。
5、输入pig脚本语句,开始计算
records = load 'in/temperature.txt' using PigStorage(' ') as (year:chararray,temperature:int);
注意事项:因为temperature.txt中我使用的是空格进行分割的。所以在这里使用PigStorage(' ')的方式,如果你的分隔符是Tab,就可以按照权威指南里的步骤进行(不加 using PigStorage(' ')即可),PigStorage的默认分割方式是Tab。我第一次就是没有加PigStorage导致实验失败的。
注意:pig并没有运行该命令,仅仅是解析了该命令,只有到使用dump命令或者是store命令时pig才会真正执行该命令。dump命令将打印出这个变量的内容,store命令将变量所代表的内容保存到一个文件中。
6、查看records的内容。
dump records;
7、对records的内容进行过滤,去掉温度等于56的一栏
filtered_records = filter records by temperature !=56;
8、查看filtered_records的内容
dump filtered_records;
9、使用group将filtered_records字段按照year分组
grouped_records = group filtered_records by year;
10、查看grouped_records的结果
dump grouped_records;
11、对grouped_records的每行数据进行处理,计算出每年最高气温
max_temp = foreach grouped_records generate group ,MAX(filtered_records.temperature);
12、查看max_temp的结果。
dump max_temp;
13、使用illustrate查看结果
通过本次实验,我们来分析pig的数据模型
filtered_records:bag{:tuple(year:chararray,temperature:int)}对应给出的结果{(1992,18),(1992,35)}
bag是一个元组,元组中有子元组(tuple),子元组的个数不限,相当于关系数据库中的表,每个表中有很多行
tuple就对应关系数据库中的行,只是它的个数和属性不要求与其他的tuple一致。
field 对应于关系数据库的属性,year:chararray给出的就是属性名year,类型是chararray
参考资料:Hadoop权威指南