Pig介绍和相对于Hive的优势
我们都知道pig和hive的作用是一致的都是为了简化mapReduce的编程而开发的,但是hive是过程化语言SQL,pig是数据流语言pig Latin.
就工具的选择来说,HiveQL类似于SQL,不需要大量的学习,所以大家在选择工具的时候一般会选择hive.
但是hive一般擅长处理的是结构化的数据,pig可以处理任何数据。pig还是有一定优势的。
hive Pig 不同点
- hive要求数据必须有scheme,但是pig什么都可以操作(结构化,非结构化,半结构化),所以有句俗话pig是家畜,什么都吃。
- hive安装需要Server,但是pig只有客户端,下载即可使用,家畜管理很方便。
pig wordcount
A = LOAD'/logdata/20130131/*/*' AS (line: chararray) ;
#加载数据
B = foreach Agenerate flatten(TOKENIZE((chararray)$0)) as word;
#切分数据
C = group B by word;
#将数据分组
D = foreach Cgenerate COUNT(B), group;
#统计每组
E = ORDER D BY ($0);
F = FILTER E BY $0> 200;
DUMP F;
# 输出
pig Latin的运行
支持本地和集群运行
本地
pig_path/bin/pig –x local wordount.pig
集群
PIG_CLASSPATH=hadoop_conf_dir pig_path/bin/pig wordcount.pig
pig dfs
pig -e fs –copyFromLocal local_path hdfs_path pig hdfs://nn.mydomain.com:9020/myscripts/script.pig
pig -e fs 可以运行hdfs命令
Pig Latin
pig 数据类型
1.基本类型:
int、long、float(浮点数,一般会丢失精度,要求严格可使用int或者long保证不丢失精度)、double(浮点数,一般会丢失精度,要求严格可使用int或者long保证不丢失精度) chararray:字符串或者字符数组。它是通过java.lang.String实现的。chararray常量是以加单引号的一系列字符来表示,例如’fred’。 bytearray:一团或者一组字节。bytearray是通过封装了java的byte[]的DataByteArray Java类来实现的。
2.复杂类型
pig有3个复杂数据类型:map、tuple和bag。 map:是一种chararray和数据元素之间的键值对映射,其中数据元素可以是任意的pig类型,包括复杂类型。chararray被称为键,它作为查找对应元素的索引,相应的数据元素被称为值。 map常量通过方括号来划定map结构,键和值间是一个#号,键值对之间使用逗号分隔。如:[‘name’#’bob’,’age#55’]。 tuple:tuple是一个定长的,包含有序pig数据元素的集合。tuple可以分为多个字段,每个字段对应着一个数据元素。这些数据元素可以是任意的数据类型,它们无须是相同的数据类型。一个tuple相当于sql中的一行,而tuple的字段相当于sql中的列。 tuple常量使用圆括号来指示tuple结构,使用逗号来划分tuple中的字段。如(‘bob’,55)。 bag:是一个无序的tuple集合,因为它无序,所以无法通过位置获取bag中的tuple。 bag常量是通过花括号进行划分的,bag中的tuple用逗号来分隔,如{(‘bob’,55),(‘sally’,52),(‘john’,25)}。 null值 在pig中null值所表达的含义是这个值是未知的,这可能是数据缺失,或者在处理数据时发生了错误等原因造成的。
3.模式
pig对于模式非常宽松,如果用户为数据定义了一个模式,那么pig会使用这个模式,为的是既可以进行预先的错误检查也可以用于执行过程的优化。如果用户没有为数据提供一个模式,pig仍然可以处理数据,它会根据脚本的如何处理数据的做出一个最合理的猜测。
数据模式化 LOAD FOREACH STREAM
可通过LOAD、FOREACH和STREAM三个操作符将数据 模式化
A = LOAD ‘data’ AS (f1:int, f2:int); // 提倡写法
A = LOAD ‘data’ AS (f1, f2); //f1和f2均为bytearray
A = LOAD ‘data’ //可以这样定义,但是schema未知 --
X = FOREACH A GENERATE f1+f2 AS x1:int; --
A = LOAD 'data'; B = STREAM A THROUGH `stream.py -n 5` AS (f1:int, f2:int);
使用load的时候指定数据的格式,默认为bytearray,也可以遍历指定,或者使用其他语言输出指定
Load操作并不会真正的执行,直到遇到a dump/store操 作 ,所以效率还可以。
Describe, Dump与Store
Describe用于描述变量的schema:
describe combotimes;
Dump将结果打印到终端上:
DUMP combotimes;
Store将结果保存到目录或者文件中:
STORE combotimes INTO ‘result/2014’;
Tokenize函数 用来分割字符串
group join等
group name by id,positions by id
join name by id,positions by id
(过滤)
divs = load 'NYSE_dividends' as (exchange:chararray, symbol:chararray, date:chararray, dividends:float);
startswithcm = filter divs by symbol matches 'CM.*';
Distinct(去重):
-- dictinct.pig daily = load 'NYSE_daily' as (exchange:chararray, symbol:chararray); uniq = distinct daily;
Limit(返回N条结果):
--limit.pig divs = load 'NYSE_dividends'; first10 = limit divs 10;
Sample(采样,百分比):
--sample.pig divs = load 'NYSE_dividends'; some = sample divs 0.1;
Parallel(设置reduce task个数):
--parallel.pig daily = load 'NYSE_daily' as (exchange, symbol, date, open, high, low, close, volume, adj_close); bysymbl = group daily by symbol parallel 10;
Order by(排序):
--order2key.pig daily = load 'NYSE_daily' as (exchange:chararray, symbol:chararray, date:chararray, open:float, high:float, low:float, close:float, volume:int, adj_close:float); bydatensymbol = order daily by date desc, symbol;
- Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失下篇
- ONOS1.3.0集群实验
- Spring Boot下的TDD(测试驱动开发)
- MySQL的索引是什么?怎么优化?
- C语言之函数
- ElasticSearch搜索引擎在SpringBoot中的实践
- 消费者驱动的微服务契约测试套件Spring Cloud Contract
- 使用Spring Boot开发一个Spring Mobile程序
- Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
- 内网穿透工具-ittun
- Elastic-Job-Spring-Boot-Starter简化你的任务配置
- Spring Boot处理REST API错误的正确姿势
- C语言之位运算
- C语言之预处理命令与用typedef命名已有类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 捉虫记:Unexpected end of JSON input while parsing
- 重新思考日志:业务系统竟然是一个大数据库?
- 测试面试题集-Linux常用命令
- 「真香警告」鱼头手摸手教你在小程序里用composition-api
- 【技术文】SSL握手中的几个密码
- 分布式监控系统SkyWalking
- 文献笔记二十九:银合欢(Leucaena trichandra)线粒体基因组
- Docker Swarm群集配置实战——第一战
- 文献笔记五十:vcf2poptree根据vcf文件构建进化树的网页工具
- typescript基础篇(6):泛型
- Flutter 初学者必读的高级布局规则
- Docker Swarm群集配置实战——第二战
- Python 基础(五):序列
- OpenCV黑魔法之隐身衣 | 附源码
- SQL 统计用户留存