pig组件
基本定义:
1.字段 field 作为基本的元素
2.n个字段组成一个元组 tuple
3.n个元组组成一个包 bag(nd表或者平面表)
其实所有的操作都会被计算机迭代遍历,快速迭代抽象成了行列级操作
PIG 加载和保存所支持的文件格式:
-----------------------------------------------------------------
--load_format加载格式------store_format保存格式 -------
--1.- Pigstorage-------------Pigstorage -------
--2.- Textloader--------------None ------
--3.- Josnloader----------Josnstorage------
--4.- Binstorage----------Binstorage------
--5.- HBaseloader-------HBasestorage------
-------------------------------------------------------------------
基本操作:
含义:1. [参数] 2.子集:各种查询分组等操作返回的数据集
行级操作:
数据加载: LOAD' [ [dir] filename]'[USING Pigstorage '分隔符' ] AS ([key1]:[type] , [key2]:[type], ...);
数据筛选查询:FILTER[table] BY[字段筛选表达式 [other more]];
数据筛选正则表达嵌套: FILTER [table] BY [字段]MATCH '正则表达式'
数据子集存储:STORT [筛选结果变量名 [other]]INTO '[ [dir] filenam]' [USING Pigstorage '分隔符' ]
数据输出:DUMP [子集]
查看子集格式: DESCRIBE [子集]
合并表或子集重复字段:DISTINCT [table或子集]
列级操作:
子集添加到新列:FOREACH [table]GENERATE [字段筛选操作]AS [添加新字段名 : 类型]
排序:ORDER [table或者子集] BY [需要排序的字段] [DESC]【默认升序,带DESC参降序】
从开始取行:LIMITE [table或子集][num]【参数num代表行数】
元素操作函数:
(列级)迭代清空字段里每个元素左右的空格字符:TRIM ([字段])
(列级)迭代字段所有元素转换每个字符为大写:UPPER ([字段])
(列级)迭代字段为所有元素去整:ROUND ([字段])
(列级)迭代字段截取自定义下标字符:SUBSTRING([字段],[开始字符位],[结束字符位])
(行级)嵌套表的压平操作:FLATTEN([字段])
以上函数和PIG语句 FOREACH GENERATE 接洽最为广泛
例子:mydata = FOREACHMyDataTable GENERATE FLATTEN('Score')
------------------------------------------------------------------------------------------------------------------------------------------
嵌套数据加载
数据原型与加载:
嵌套字典:(val_1,val_2, { ('key1',value1) , ('key2',value2) } )
LOAD '[filename]' AS
( 字段1:val_1_Type , 字段2:val_2_Type , 字段3:bag{ 字段1:tuple(tuple_key1:Type , tuple_key2:Type) })
注:加载后的仍然是一个嵌套表,相当于上面 1.字段3 里含有表(bag),而表里面又含有一个字典,
怎么取里面的值:字段3.tuple1 =value1
嵌套MAP:(val1,[map_val_1#value1,map_val_2#value2])
LOAD '[filename]' AS ( 字段1:val1_Type, 字段2:map[] )
取值:字段2#'map_val_1'
---------------------------------------------------------------------------------------------------------------------------------------------------------
分组查询
(列级的行合并操作)字段分组:子集名1=GROUP [table] BY 字段
注:line_name一样的元素会在分组后进行在唯一line_name后追加元素
列列
(张三,50)(张三,((张三,50),(张三,60)))
(张三,60) ——》(李四,(李四,70))
(李四,70)
***********************************************************************************************************************
(列级的行操作)分组后字段求和:子集名2=FOREACH 子集名1GENERATE group【显示第一字段】,SUM(原table.求和字段)
注:分组后需要统计的字段是无法操作的,所以这里用原table
group:这个是你子集名1的第一个字段取名为group
结果:子集1——》(张三,110)
(李四,70)
***********************************************************************************************************************
(列级的行操作)所有行求和:子集3=GROUP[table] ALL
原型:(all,(张三,50),(张三,60),(李四,70))
子集4=FOREACH子集3 GENERATE SUM(原table.求和字段)
原型:(all,180)
************************************************************************************************************************
连接查询
子集名=JOIN [table1] BY [字段] [LEFT | RIGHT | FULL] OUTER,[table2] BY [字段]
这里会涉及到表与表的行级拼接字段可能会不匹配(长度不一),所以如下解释:
LEFT OUTER:作左连接(拼接后显示的表行优先级为左)根据左边表 table1 [字段]的行数据向左拼接
RIGHT OUTER:作右连接(拼接后显示的表行优先级为右)根据右边表的 table2 [字段]的行数据做向右拼接
FULL OUTER:直接全连接(表长度最长,没有字段元素的行留 NULL)
如上的操作可以进行相同字段进行多表的拼接
************************************************************************************************************************
网状式交叉数据集
子集名=CROSS [table1] , [table2]
针对table里面的所有元素做排列
(1 2 3) (a,b,c)
(1(1,a),(1,b),(1,c))
(2,(2,a),(2,b),(2,c))
(3,(3,a),(3,b),(3,c)
*************************************************************************************************************************
头尾式拼接
子集名=UNION [table1],[table2]
**************************************************************************************************************************
分片操作
SPLIT [table] INTO name1 if [字段逻辑判断1],name2 if [字段逻辑判断2],name3[字段逻辑判断3]
字段逻辑判断1、2、3、分别会返回给 name1、2、3、
***************************************************************************************************************************
sqoop1.X组件操作
导表操作:
数据库单表导入:
sqoop import
--table localhost_tablename【本地需要导入到HDFS的表】
--connect jdbc:mysql://localhsot/database 【JDBC驱动连接主机名/database】
--username [你的SQL用户名] --password [你的SQL密码]
--fields-terminated-by '\t' '\tab' 'space'','【导入到HDFS文件字段分隔符'char'】
--warehouser-dir [/hdfs_dirname]
--table [HDFS_tablename]
指定数据库全表导入:
sqoop import-all-table
--connect jdbc:mysql//localhost/database【JDBC驱动连接的主机名/数据库名】
--username [YouName] --password[YouPWD]
其它参数:--incremental lastmodified [append/delete]【导入的模式】
--check-column mod_dt 【字段】
--last-value '2018-01-06 16:00:00' 【字段插入起点】
lastmodified模式去处理增量时,会将大于等于last-value值的数据当做增量插入.
使用lastmodified模式进行增量处理要指定增量数据是以append模式(附加)【插入指定的时间戳大的值】
还是merge-key(合并)模式添加 【全部重新处理】
也就是加参数--append OR --merge-key
--incremental append
--check-column [字段]
--last-value [字段里的值]
这三个参数指定 向指定字段添加大于参数--last-value数据
指定字段导入:
sqoop import --table tablename_localhost
--connect jdbc:mysql://loaclhost/database
--username [] --password []--columns “字段1,字段2, ..........”指定分区:--where "state='分区名'"指定查询子集导入:sqoop import--conect jdbc:mysql://localhost/database--username [] --password []--target-dir /HDFS_database_dir--split-by 【Maper_key】--query 'SELECT ...... WHERE ...... and $CONDITIONS' 【and $CONDITIONS 为必填参数-m [number] 指定Mapper的个数【同名--num-mappers】
-m [number] 【Maper的数量】--hive-import 【导入到Hive】
反向的export 【HDFS---》RDBMS】
sqoop export
--connect jdbc:mysql://localhost/database
--username [] --passwprd []
--export-dir /HDFS_table_dir
--updata-mode [allowinsert【冗余性ALL】 | uodateonly【判断为无数据导出】]
--table localhost_tablename