Hadoop组件,(ETL数据清洗)Pig,Sqoop文件搬运工具基础操作

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值