大家好,又见面了,我是你们的朋友全栈君。
原文地址 : http://blog.csdn.net/nsrainbow/article/details/43426061 最新课程请关注原作者博客,获得更好的显示体验
声明
- 本文基于Centos 6.x + CDH 5.x
Pig 有什么用
grunt> ls
hdfs://mycluster/user/root/.staging <dir>
hdfs://mycluster/user/root/employee <dir>
hdfs://mycluster/user/root/people <dir>
grunt> cd ..
grunt> ls
hdfs://mycluster/user/cloudera <dir>
hdfs://mycluster/user/history <dir>
hdfs://mycluster/user/hive <dir>
hdfs://mycluster/user/root <dir>
hdfs://mycluster/user/test3 <dir>
hdfs://mycluster/user/test_hive <dir>
就像操作linux shell 一样的操作 hdfs 空间
安装Pig
yum install pig
设置环境变量
)
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
然后运行 source 让设置生效
[root@host1 impala]# source /etc/profile[root@host1 impala]# echo $HADOOP_MAPRED_HOME/usr/lib/hadoop-mapreduce
启动交互模式的Pig
$ pig
看到一堆日志最后出现
, use fs.defaultFS2015-02-02 08:29:03,302 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFSgrunt>
试着运行ls命令可以看到当前用户目录下的文件
grunt> ls
hdfs://mycluster/user/root/.staging <dir>
hdfs://mycluster/user/root/employee <dir>
hdfs://mycluster/user/root/people <dir>
还可以cd 到上一级,再ls
grunt> cd ..
grunt> ls
hdfs://mycluster/user/cloudera <dir>
hdfs://mycluster/user/history <dir>
hdfs://mycluster/user/hive <dir>
hdfs://mycluster/user/root <dir>
hdfs://mycluster/user/test3 <dir>
hdfs://mycluster/user/test_hive <dir>
怎么样?是不是比直接输入 hdfs dfs -ls / 这一大串命令爽多了?
Latin语言
- 用Latin语言可以写出MapReduce的Job, Pig会帮你把你写的Latin转化为MapReduce任务而不用去写具体的代码
- Latin原因是大小写敏感的
- Latin的命令最好用大写字母书写
Step1
(Dec 10 01:22:11 NetworkManager: <INFO> hello world [start]
(Dec 10 03:56:43 NetworkManager: <WARN> Oops! There is an error!
(Dec 10 04:10:18 NetworkManager: <WARN> Please check the database ...
(Dec 10 05:22:11 NetworkManager: <INFO> hello world [end]
Step2
grunt > cd hdfs://mycluster/
grunt > cd user
grunt > mkdir pig
grunt > cd pig
grunt > copyFromLocal /root/logs logs
hdfs dfs -put /root/logs /user/pig
Step3
grunt> messages = LOAD '/user/pig/logs';
grunt> warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
grunt> DUMP warns;
执行结果
((Dec 10 03:56:43 NetworkManager: <WARN> Oops! There is an error!)((Dec 10 04:10:18 NetworkManager: <WARN> Please check the database ...)
解释
messages = LOAD '/user/pig/logs';
- 定义了一个关系叫 message ,你可以把Pig中的关系看成是一种变量
- message之后跟等号之间的空格不可以省略,包括等号后的空格也不可以省略,否则出错
- LOAD 意思是加载内容,后面的地址是hdfs的地址
- 整句话的意思是加载 /user/pig/logs 中的内容到 message 中
warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
- FILTER … BY … 意思是根据… 来过滤某个关系,这句话中就是一个根据 BY 后面的条件来过滤message
- $0 代表每一行的第一个元素,当有集合出现的时候 $0 代表第一个元素,$1代表第二个元素,以此类推,当只有一串字符串的时候 $0 就代表正行字符串
- MATCHES 表示用正则来匹配,这句话中用 .*WARN+.* 来匹配含有WARN信息的日志
- 将匹配的结果赋给warns
DUMP warns;
- pig脚本总是以DUMP命令结尾,DUMP代表执行前面所定义的MapReduce任务,并输出结果
- DUMP命令回车后才真正开始执行MapReduce过程
由此可以看出一个需要很多java代码的MapReduce任务被简化成了三句话,如此的简洁。
Pig Latin 语言手册 墙裂建议大家不要看中文的资料,就算用词典慢慢看也好,至少英文官方文档不会误导你,看多少就算多少
跟Hbase交互
Step1
4000001,Kristina,Chung,55,Pilot
4000002,Paige,Chen,74,Teacher
4000003,Sherri,Melton,34,Firefighter
4000004,Gretchen,Hill,66,Computer hardware engineer
4000005,Karen,Puckett,74,Lawyer
4000006,Patrick,Song,42,Veterinarian
4000007,Elsie,Hamilton,43,Pilot
4000008,Hazel,Bender,63,Carpenter
上传到hdfs的 /user/pig 目录下
grunt > cd /user/pig
grunt > copyFromLocal /root/customers ./customers
Step2
hbase(main):001:0> create 'customers', 'customers_data'
Step3
raw_data = LOAD 'hdfs:/user/pig/customers' USING PigStorage(',') AS (
custno:chararray,
firstname:chararray,
lastname:chararray,
age:int,
profession:chararray
);
STORE raw_data INTO 'hbase://customers' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
'customers_data:firstname
customers_data:lastname
customers_data:age
customers_data:profession'
);
在这个例子中第一个列custno会被作为hbase 的 rowkey
Step4
$ PIG_CLASSPATH=/usr/lib/hbase/hbase-client-0.98.6-cdh5.2.1.jar:/usr/lib/zookeeper/zookeeper-3.4.5-cdh5.3.0.jar /usr/bin/pig /root/Load_HBase_Customers.pig
这里的jar包根据你们的实际情况改变
Step5
hbase(main):001:0> scan 'customers'
跟Hive交互
HCatalog是什么
它使得数据消费者不必知道其数据存储的位置和方式。HCatalog依赖于Hive 的 metastore服务,所以其他服务比如Pig可以通过HCatalog访问由Hive metastore定义的那些表。
计算平均工资的例子
Step1
hive > CREATE TABLE occupations(code STRING, description STRING,salary INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '4';
Step2
11-0000,Management occupations,96150
11-1011,Chief executives,151370
11-1021,General and operations managers,103780
11-1031,Legislators,33880
11-2011,Advertising and promotions managers,91100
Step3
hive> LOAD DATA LOCAL INPATH '/root/occupations.txt' INTO TABLE occupations;
Step4
occ_data = LOAD 'occupations' USING org.apache.hcatalog.pig.HCatLoader();
salaries = GROUP occ_data ALL;
out = FOREACH salaries GENERATE AVG(occ_data.salary);
DUMP out;
并查看计算出的平均工资结果
SELECT AVG(salary) FROM occupations;
这样看起来pig反而比Hive还麻烦了?其实不是的,我只是用这个例子来说明pig跟hive之间的交互,并没有任何的比较性。
参考资料
- http://archive-primary.cloudera.com/cdh5/cdh/5/pig/basic.html
- https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat
- http://archive-primary.cloudera.com/cdh5/cdh/5/pig/start.html#execution-modes
- http://www.cloudera.com/content/cloudera/en/documentation/core/v5-2-x/topics/cdh_ig_pig_hbase.html
- http://princetonits.com/technology/loading-customer-data-into-hbase-using-a-pig-script/
- http://docs.hortonworks.com/HDPDocuments/HDP1/HDP-1.3.7/bk_user-guide/content/user-guide-hbase-import-2.html
- http://gethue.com/hadoop-tutorial-how-to-access-hive-in-pig-with/
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142096.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...