大数据之pig 命令
1.pig与hive的区别
pig和hive比较类似的,都是类sql的语言,底层都是依赖于hadoop
走的mapreduce任务。
pig和hive的区别就是,想要实现一个业务逻辑的话,使用pig需要一步一步操作
而使用hive的话一条SQL就可以搞定。
如果想在很短时间内获取一个比较复杂的业务逻辑处理结果的话,建议使用pig。
如果需要定时执行的一些任务,建议使用hive。
2:pig和mapreduce对比
pig优点:针对一些基本的处理逻辑,已经做好了封装,直接使用对应的命令即可。
但是使用mapreduce代码的话就需要我们自己实现了,并且使用pig还不需要
考虑代码的优化。
使用mapreduce的话会出现数据倾斜的问题,但是使用pig可以避免这个问题。
3:pig的应用场景
最主要的就是数据清洗
4:pig的使用方式
1:在pig(grunt)命令行下执行命令
2:在shell命令下执行
bin/pig -e "A = load 'a.txt' as (id:int,name:chararray);dump A;"
3:使用脚本来执行
vi my.pig
-- 单行注释
/*
多行注释
*/
A = load 'a.txt' as (id:int,name:chararray);
dump A;
执行命令
bin/pig my.pig
5:pig里面的数据类型
基本数据类型
int、long、float、double、chararray、bytearray、boolean、datetime、biginteger、bigdecimal
注意:chararray,表示字符串类型
复合数据类型
tuple、bag、map
注意:
tupe (1,2,3)
bag {(1,2,3),(1,2,3),(1,2,3)}
map [key#value]
6:pig中的一些命令
load:加载数据
A = load 'a.txt' as (id:int,name:chararray)
注意:as 后面指定的文件数据结构信息,这个表示会在当前目录下找a.txt文件,
根据(id:int,name:chararray)对文件中的数据进行解析。这样需要确保文件中
这两列数据中间是使用制表符分割的。
如果加载的数据中多个列之间不是使用制表符分割的,那么在加载数据的时候
就需要执行指定分割符了,例子中是使用逗号进行分割的。
例子:A = load 'a.txt' using PigStorage(",") as (id:int,name:chararray);
A 和 = 之间必须有空格。建议命令之间都加上空格,这样看起来简洁,也不容易出错。describe:类似于sql中的查看表结构
例子:describe A;
group : 分组,类似于sql中的groupby
例子:B = group A by id;
foreach:对结果集中的数据进行迭代处理
例子:C = foreach A generate id ,name;
或者也可以使用$0类似的命令来获取结果集中的数据
C = foreach A generate $0 ,$1;
filter:过滤
例子:D = filter A by id =='zs';
常用的表达式: ==
!=
>=
<=
>
<
join:类似于sql中的表链接
内链接:
C = join A by id,B by id;
外连接
左外连接:C = join A by id left outer,B by id;
在查询数据的时候,以左侧数据为基准,只返回左侧有的数据
右外连接:C = join A by id right outer,B by id;
在查询数据的时候,以右侧数据为基准,只返回右侧有的数据。
全外连接:C = join A by id full outer,B by id;
在查询数据的时候,两侧数据都可以返回。
7:pig的命令
limit:类似于sql中的limit,可以获取数据集中的一部分数据
例子:B = limit A 10;(取前10条数据)
此种方式pig仍会读取所有数据,只是在返回的时候返回指定条数的数据
order by:排序,类似于sql中的order by
例子:B = order A by id;
默认是正序,想到倒序的话需要在指定字段后面添加desc;
order by后面可以指定多个分组字段。
order A by id desc, name desc (对A中的数据进行排序,先根据ID进行倒序排列,如果ID相等,那么使用name字段进行倒序排序。)
SPLIT:根据条件对数据集进行切分
例子:split A into x1 if x>10 ,x2 if x==20 ,x3 if (x>1 and x<10);
union:类似于sql中的union all
例子:C = union A, B;
一般情况下使用union操作的两个临时变量的数据结构都一样,
如果不一样,可以分下面两种情况
1:A 中id字段是float类型的,B中的id字段是double类型的,这样的话float可以转换成double,所以使用union之后生成的临时变量C中id就是double类型的。
2:A 中id字段是float类型的,B中的id字段是chararray类型的,这样的话两种数据类型不能想换转换,所以执行会报错。
8:pig命令的注意事项
1:所有命令都是以;结尾
2:Pig对命令的大小写没有规定,可以使用大写,也可以小写,但是,针对pig中的函数就必须使用大写,因为这些函数在pig中定义的时候就是大写。
针对PIG处理过程中的临时变量的名称,大小写也是有区分的。
3:在pig中执行的命令其实并不会真正的执行,只有当执行dump或者store命令的时候才会真正指定之前定义的命令。
4:如果某一条命令执行失败了,那么只需要修改这条命令,重新执行即可。
9:pig命令行的扩展
fs:可以在pig中执行hdfs中的命令
sh:可以在pig中执行shell命令(在0.8版本之后才有)
clear:清屏
exec:在pig命令行下执行pig脚本 例子:pig my.pig
history:查看在pig命令行下执行的命令记录
quit:退出pig命令行
10:pig中的内建函数
avg:求平均数
例子:B = group A by id;
C = foreacg B generate group,AVG(score);
SUM:求和
MAX:求最大值
MIN:求最小值
上面这几个函数使用方法一样。
注意:函数名称必须要大写。
COUNT():求总数。
1:先分组,再求和。和上面的用法一致。
2:执行类似于select count(*) from table操作。
这样的话也需要对table中的分组,因为是要求所有的数据总数,所以可以把所有数据分到一个组里面,
使用B = group A all;(all相当于是一个关键字)
再使用C = foreach B generate COUNT(A);
10:pig中自定义函数
使用java代码自定义函数,需要创建一个类,集成evalFunc类,实现为实现的exec函数,在这里面就可以对数据进行处理。
先添加maven依赖
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
package pig;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
public class UPPER extends EvalFunc<String> {
@Override
public String exec(Tuple input) throws IOException {
if(input==null || input.size()==0 || input.get(0)==null){
return null;
}
try {
String str = (String)input.get(0);
return str.toUpperCase();
} catch (Exception e) {
throw new IOException("转换大写失败 ", e);
}
}
}
代码实现完之后就需要打包了。
在这打包的话不需要打依赖,直接在eclipse中右键export导出为一个jar即可。
在把这个jar放到pig所在的服务器上,建议放在pig的根目录下面。
后面想使用这个函数的时候,需要先把这个jar在pig中注册一下
register myudf.jar
下面就可以使用前面定义的函数了。
例子:
-- vi myscript.pig
REGISTER myudfs.jar;
A = LOAD 'a.txt' AS (name: chararray, age: int);
B = FOREACH A GENERATE pig.UPPER(name);
DUMP B;
pig -x local myscript.pig
11:实战一(wlan上网日志处理)
1:先把数据上传到服务器上
2:在pig中加载这些数据
A = LOAD 'HTTP_20130313143750.dat' AS (reportTime:long, msisdn:chararray, apmac:chararray, acmac:chararray, host:chararray, siteType:chararray, upPackNum:long, downPackNum:long, upPayLoad:long, downPayLoad:long, httpStatus:chararray);
3:截取需要的数据
B = FOREACH A GENERATE msisdn, upPackNum, downPackNum, upPayLoad, downPayLoad;
4:对数据进行分组
C = GROUP B BY msisdn;
5:对上行,下行数据进行统计
D = FOREACH C GENERATE group, SUM(B.upPackNum), SUM(B.downPackNum), SUM(B.upPayLoad), SUM(B.downPayLoad);
6:存储清洗的结果
STORE D INTO 'wlan_result';
12:实战二(tomcat访问日志处理)
统计PV和UV
pv:其实就是统计文件中数据的总条数
UV:其实就是统计文件中独立ip出现的次数
1:把数据上传到服务器
2:使用pig加载数据
A = load 'access_2015_03_30.log' USING PigStorage(' ') as (ip:chararray,one:chararray,two:chararray,time:chararray,timezone:chararray,method:chararray,url:chararray,http:chararray,statu:long,data:long);
注意:这个日志文件中数据列之间是使用空格隔开的,所以在使用load的时候需要指定分隔符
3:截取需要的数据
B = foreach A generate ip,url;
4:统计PV
1)对B中的数据进行分组,都分到一组,使用all关键字
C = group B all;
2)在使用count函数求和
PV = foreach C generate COUNT(B);
5:统计UV
1)对B中的数据进行分组,使用ip作为分组字段,这样可以保证分组之后这个分组字段的值是不重复的。
C = group B by ip;
2)对分组之后的C中的数据进行处理,由于只需要统计独立IP,所以只需要获取分组字段即可
D = foreach C generate group;
3)对D中的数据再使用all关键字分组,分到一个all组里面
E = group D all;
4)使用count函数统计独立IP的总数
UV = foreach E generate COUNT(D);
6:把pv和uv整合到一块
PV_UV = join PV by '1',UV by '1';
7:还需要在PV和UV的数据里面加上时间字段
END = foreach PV_UV generate '2013-05-30',$0,$1;
8:把清洗的数据结果保存起来
store END into 'pv_uv';
13:pig扩展
设置pig中mr任务的名称
set job.name 'my-job-name';
建议在使用pig脚本的时候,在每个pig脚本的第一行指定上面参数,设置不同的任务名称。
大数据之pig 命令的更多相关文章
- 大数据之pig安装
大数据之pig安装 1.下载 pig download 2. 解压安装 mapreduce模式安装: 1:设置HADOOP_HOME,如果pig所在节点不是集群中的节点,那就需要把集群中使用的hado ...
- 大数据-Hive 常用命令
Hive 启动 ~$ hive 退出 hive>quit; --退出hive or hive> exit; --exit会影响之前的使用,所以需要下一句kill掉hadoop的进程 > ...
- GreenPlum 大数据平台--常用命令
gpstate 命令 参数 作用 gpstate -b => 显示简要状态 gpstate -c => 显示主镜像映射 gpstart -d => 指定数据目录(默认值:$MASTE ...
- 入门大数据---HBase Shell命令操作
学习方法 可以参考官方文档的简单示例来 点击查看 可以直接在控制台使用help命令查看 例如直接使用help命令: 从上图可以看到,表结构的操作,表数据的操作都展示了.接下来我们可以针对具体的命令使用 ...
- 大数据测试之hadoop命令大全
1.列出所有Hadoop Shell支持的命令 $ bin/hadoop fs -help2.显示关于某个命令的详细信息 $ bin/hadoop fs -help command-name3.用户可 ...
- 大数据 - spark-sql 常用命令
--spark启动 spark-sql --退出 spark-sql> quit; --退出spark-sql or spark-sql> exit; 1.查看已有的database sh ...
- 大数据学习之路之Hadoop
Hadoop介绍 一.简介 Hadoop是一个开源的分布式计算平台,用于存储大数据,并使用MapReduce来处理.Hadoop擅长于存储各种格式的庞大的数据,任意的格式甚至非结构化的处理.两个核心: ...
- 大数据每日干货第四天(linux基础之一目录结构与常用命令)
为了和qq空间同步,也写的第四天,前面几天明天会发布,本来打算把每天学的东西记录下来,通过朋友给的建议要发的话稍微系统化下,从大数据需要的linux基础,到离线数据分析包括hadoop. ...
- 大数据系列之数据仓库Hive命令使用及JDBC连接
Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...
随机推荐
- sscanf()函数的使用及其实例
资料引自: 传送门 sscanf函数原型: Int sscanf( const char * src, const char * format, ...); int scanf( const char ...
- [转]vim编辑器---批量注释与反注释
转 在使用vim编写代码的时候,经常需要用到批量注释与反注释一段代码.下面简要介绍其操作. 方法一 块选择模式 插入注释: 用v进入virtual模式 用上下键选中需要注释的行数 按Control+v ...
- python模块app登陆认证(M2Crypto数字证书加密)
需求: 1.通过数字证书,非对称加密方式传送对称秘钥给服务端 2.用户名.密码使用对称秘钥加密,发送服务端验证 3.传送数据使用字节流方式 实现思路: 1.了解python的struct模块,用于字节 ...
- CSS3-border-radius的兼容写法大全
<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...
- bootstrap的学习-基础样式和排版一
一.列表去除样式和横排排列 classs="list-unstyled","list-inline" 二.[表格].table 类指定基本样式,.table-s ...
- PyQ1_介绍
PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一.PyQt是由Phil Thompson 开发. PyQt实现了一个Python模块 ...
- Android学习笔记——menu
该工程的功能是实现两个数相乘,并在另外一个Activity中显示计算的结果 以下的代码是MainActivity.java中的代码 package com.example.menu; import a ...
- Tomcat 开发web项目报Illegal access: this web application instance has been stopped already. Could not load [org.apache.commons.pool.impl.CursorableLinkedList$Cursor]. 错误
开发Java web项目,在tomcat运行后报如下错误: Illegal access: this web application instance has been stopped already ...
- Starling Tutorial
http://www.hsharma.com/tutorials/starting-with-starling-ep-1-intro-setup/
- ecshop 后台-》广告
1.后台广告宽度限制不能超过1024,高度大于1,admin/ad_position.php 第236行 || $ad_width < ) { make_json_error($_LANG['w ...