[db] hadoop && pig
Posted 战侠歌1994
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[db] hadoop && pig相关的知识,希望对你有一定的参考价值。
hadoop && pig
Hadoop
最近需要用到hadoop操作,发现hadoop的官网真的良心的,没那么多废话,直接说明白怎么用,而且还是中文的,简单粗暴啊!!!
hadoop document
在mapreduce中,map的输出是具有自动排序功能的!!!
pig
另外还有一个pig语言,是一种过程语言,类似于mysql(这玩意也不熟~尴尬)。
总结下pig的用法,顺带实验例子。
pig数据类型
- double | float | long | int | chararry
| bytearray - tuple | bag | map
tuple类似matlab cell,元素类型可以不同(‘haha‘,1)
bag相当于tuple的集合,用{}表示,{(‘haha‘,1),(‘hehe‘,2)}
field是列数据标识
map相当于hash表,key为chararray,value为任意类型
运行和注释
运行:
本地模式:pig -x local
集群模式:pig -x mapreduce 或者 pig
批处理pig文件,上两行命令后接pig文件名,pig xx.pig
注释:
行注释 --
段注释 /**/
pig latin
>> cat 1.txt
a 1 2 3 4.2 9.8
a 3 0 5 3.5 2.1
b 7 9 9 - -
a 7 9 9 2.6 6.2
a 1 2 5 7.7 5.9
a 1 2 3 1.4 0.2
[]代表可选项
pig命令不区分大小写
LOAD
load = LOAD ‘data_path‘ [USING function] [AS schema]
A = LOAD ‘1.txt‘ USING PigStorage(‘ ‘) AS (col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double);
将1.txt的每行数据用‘ ‘分割,分装到对应的col1,col2的列名进行数据解析,如果没有指定,可以用$0 $n
来索引。
pig默认PigStorage()
读入本地磁盘或者hadoop路径数据,org.apache.hcatalog.pig.HCatLoader()
读取hive表;()中的是分隔符。
GROUP
B = GROUP A BY (col2, col3, col4);
out:
((1,2,3),{(a,1,2,3,1.4,0.2),(a,1,2,3,4.2,9.8)})
((1,2,5),{(a,1,2,5,7.7,5.9)})
((3,0,5),{(a,3,0,5,3.5,2.1)})
((7,9,9),{(a,7,9,9,2.6,6.2),(b,7,9,9,,)})
用(col2, col3, col4)对A分组,然后按组将每条tuple汇聚成一个bag.B:{group:(col2,col3,col4),A:bag:{tuple,tuple}}
group分组操作,将数据分组为group_col:bag,第一个字段被命名为‘group‘,第二个字段是bag,包含‘group‘对应的值的所有tuple集合。
FOREACH
C = FOREACH B GENERATE group, AVG(A.col5), AVG(A.col6);
out:
((1,2,3),2.8,5.0)
((1,2,5),7.7,5.9)
((3,0,5),3.5,2.1)
((7,9,9),2.6,6.2)
其中(1.4+4,2)/2=2.8
foreach是遍历每个组中的tuple,并对其进行处理。
AVG(平均),COUNT(计数),MIN,MAX
基本和excel的缩写一致。
C:{group:(col2,col3,col4),double,double}.
一般foreach和generate是一块使用的,在数据较大时,建议尽早使用foreach generate过滤掉多余信息以减少数据交换。
FILTER
d = filter A by $0 == ‘a‘;
out:
(a,1,2,3,4.2,9.8)
(a,3,0,5,3.5,2.1)
(a,7,9,9,2.6,6.2)
(a,1,2,5,7.7,5.9)
(a,1,2,3,1.4,0.2)
按照要求过滤数据,可以使用and or连接多个条件,滤除无用信息null 0 -1...
CONCAT & SUBSTRING
B = FOREACH A GENERATE CONCAT($0, (chararray)$1,(chararray)$2,(chararray)$3);
out:
(a123)
(a305)
(b799)
(a799)
(a125)
(a123)
C = foreach B generate (chararray)SUBSTRING($0,0,2);
out:
(a1)
(a3)
(b7)
(a7)
(a1)
(a1)
concat拼接两字符串,substring按长度截取字符串[0,2)左闭右开区间。
显示和存储
DUMP C;
STORE C INTO ‘output_path‘
DUMP显示,上边所有的out部分。store是存储。
JOIN,UNION,COGROUP,CROSS
a.txt:
(2,Tie)
(4,Coat)
(3,Hat)
(1,Scarf)
b.txt:
(Joe,2)
(Hank,4)
(Ali,0)
(Eve,3)
(Hank,2)
A = LOAD ‘a.txt‘ USING PigStorage(‘,‘);
B = LOAD ‘b.txt‘ USING PigStorage(‘,‘);
JOIN
C = JOIN A BY $0, B BY $1;
out:
(2,Tie,Hank,2)
(2,Tie,Joe,2)
(3,Hat,Eve,3)
(4,Coat,Hank,4)
根据key得到行加入。inner join,一般用A小表join B大表,起到部分过滤的作用。
还有一个left join: left outer
UNION
D = UNION A, B;
out:
(Joe,2)
(Hank,4)
(Ali,0)
(Eve,3)
(Hank,2)
(2,Tie)
(4,Coat)
(3,Hat)
(1,Scarf)
可以对不同字段数的数据集进行union操作。
COGROUP
E = COGROUP A BY $0, B BY $1;
E = COGROUP A BY $0, B BY $1 outer;
out:
(0,{},{(Ali,0)})
(1,{(1,Scarf)},{})
(2,{(2,Tie)},{(Hank,2),(Joe,2)})
(3,{(3,Hat)},{(Eve,3)})
(4,{(4,Coat)},{(Hank,4)})
F = COGROUP A BY $0 inner, B BY $1;
out:
(1,{(1,Scarf)},{})
(2,{(2,Tie)},{(Hank,2),(Joe,2)})
(3,{(3,Hat)},{(Eve,3)})
(4,{(4,Coat)},{(Hank,4)})
输出一组嵌套的tuple结构。COGROUP为每个不同的key生成一个tuple。每个tuple的第一个字段就是key。其他字段是各个关系中匹配该键值的元组所组成的 bag。第一个bag中是A中的匹配tuple,第二个bag是B的,没有匹配的则为空{}。
COGROUP的默认类型outer连接。
CROSS
F = CROSS A, B;
out:
(1,Scarf,Hank,2)
(1,Scarf,Eve,3)
(1,Scarf,Ali,0)
(1,Scarf,Hank,4)
(1,Scarf,Joe,2)
(3,Hat,Hank,2)
(3,Hat,Eve,3)
(3,Hat,Ali,0)
(3,Hat,Hank,4)
(3,Hat,Joe,2)
(4,Coat,Hank,2)
(4,Coat,Eve,3)
(4,Coat,Ali,0)
(4,Coat,Hank,4)
(4,Coat,Joe,2)
(2,Tie,Hank,2)
(2,Tie,Eve,3)
(2,Tie,Ali,0)
(2,Tie,Hank,4)
(2,Tie,Joe,2)
CROSS 笛卡尔积。会将第一个关系中的每个元组和第二中的所有元组进行连接。这个操作的输出结果的大小是输入关系的大小的乘积。
暂时用这么多,后续有可能再补充。
Reference
http://blackproof.iteye.com/blog/1791980
http://www.360doc.com/content/15/0520/20/13670635_472030452.shtml
http://blog.csdn.net/gg584741/article/details/51712242
https://www.codelast.com/%E5%8E%9F%E5%88%9Bpig%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5%E6%80%BB%E7%BB%93/
http://www.aboutyun.com/thread-6713-1-1.html
以上是关于[db] hadoop && pig的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu14下Hadoop开发<2> 编译64位Hadoop2.4