[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的主要内容,如果未能解决你的问题,请参考以下文章

估计PI——OpenCV&Cpp

atan2(y,x) && pow(x,y)

RT-Thread&ART-PI文件系统在SDIO上的使用

Ubuntu14下Hadoop开发<2> 编译64位Hadoop2.4

Elasticsearch-hadoop & Elasticsearch-spark sql - 语句跟踪扫描&滚动

RT-Thread&ART-PI文件系统在SDIO上的使用