by Gary
# Apache Pig构建在Hadoop上以提供高级数据处理
people = LOAD '/user/training/customers' AS (cust_id, name);
orders = LOAD '/user/training/orders' AS (ord_id, cust_id, cost);
groups = GROUP orders BY cust_id;
totals = FOREACH groups GENERATE group, SUM(orders.cost) AS t;
result = JOIN totals BY group, people BY cust_id;
DUMP result;
# Pig解释器在客户端计算机上运行
# 在本章中,您将学习
# Pig简介
# Apache Pig是用于Hadoop的数据分析和处理的平台
# 最初在雅虎作为一个研究项目
# Pig的主要组件
# CDH是安装Hadoop和Pig最简单的方法
# 安装不在本课程范围内
# Pig简介
# Pig是编写低级MapReduce代码的替代方法
# 许多功能使Pig能够进行复杂的数据分析和处理
# Pig简介
# 许多组织使用Pig进行数据分析
# Pig也经常用于数据处理
# Pig可以帮助您从Web服务器日志文件中提取有价值的信息
# 抽样可以帮助您探索大型数据集的代表性部分
# Pig还广泛用于提取,转换和加载(ETL)处理
# Pig简介
# 你可以通过Grunt shell交互地使用Pig
# 如何启动,使用和退出Grunt的示例
$ pig
grunt> allsales = LOAD 'sales' AS (name, price);
grunt> bigsales = FILTER allsales BY price > 100;
grunt> STORE bigsales INTO 'myreport';
grunt> quit;
# 也可以通过-e从UNIX shell执行Pig Latin语句选项
# 可以通过fs命令使用Pig操作HDFS
grunt> fs -mkdir sales/;
grunt> fs -put europe.txt sales/;
grunt> allsales = LOAD 'sales' AS (name, price);
grunt> bigsales = FILTER allsales BY price > 100;
grunt> STORE bigsales INTO 'myreport';
grunt> fs -getmerge myreport/ bigsales.txt;
# 使用sh命令可以从Pig运行UNIX程序
grunt> sh date;
Wed Nov 12 06:39:13 PST 2014
grunt> fs -ls; -- lists HDFS files
grunt> sh ls; -- lists local files
# Pig脚本只是存储在文本文件中的Pig Latin代码
# 可以通过运行命令从Grunt shell中运行Pig脚本
grunt> run salesreport.pig;
# 通常直接从UNIX shell运行Pig脚本
$ pig salesreport.pig
# 如前所述,Pig将Pig Latin转换为MapReduce作业
# 也可以使用x标志在本地模式下运行Pig
在将作业部署到生产之前可以有助于测试
$ pig –x local -- interactive
$ pig -x local salesreport.pig -- batch
# 如果作业失败,Pig可能会生成一个日志文件来解释为什么
这些日志文件通常在当前工作目录中生成
# Pig简介
# Pig提供了直接编写MapReduce代码的替代方法
# 可以通过Grunt交互地执行Pig Latin代码
# 在用于批处理执行的脚本中存储Pig Latin代码也是常见的
# 在本章中,您将学习
# 基本数据分析
# Pig Latin是一种数据流语言
# 以下是一个简单的Pig Latin脚本,用于加载,过滤和存储数据
allsales = LOAD 'sales' AS (name, price);
bigsales = FILTER allsales BY price > 999; -- in US cents
/*
* Save the filtered results into a new
* directory, below my home directory.
*/
STORE bigsales INTO 'myreport';
# Pig Latin关键字在此以蓝色文本突出显示
# 标识符是分配给字段和其他数据结构的名称
# 标识符必须符合Pig的命名规则
# 标识符必须始终以字母开头
# Pig Latin支持两种类型的注释
allsales = LOAD 'sales' AS (name, price);
bigsales = FILTER allsales BY price > 999; -- in US cents
/*
* Save the filtered results into a new
* directory, below my home directory.
*/
STORE bigsales INTO 'myreport';
# 在Pig Latin中大小写是否重要取决于上下文
# 关键字(此处显示为蓝色文字)不区分大小写
# 标识符和路径(此处以红色文字显示)区分大小写
# Pig Latin中的许多常用运算符对SQL用户很熟悉
# 基本数据分析
# Pig的默认加载函数称为PigStorage
# 考虑HDFS中名为sales的以下文件
Alice 2999
Bob 3625
Carlos 2764
# 此示例从上面的文件加载数据
allsales = LOAD 'sales' AS (name, price);
# 上一个示例从名为sales的文件加载数据
allsales = LOAD 'sales' AS (name, price);
# 因为这不是一个绝对路径,它是相对于你的home目录
# 该路径也可以引用一个目录
还支持文件模式(“globs”)
allsales = LOAD 'sales_200[5-9]' AS (name, price);
# 前面的示例还为每个列分配了名称
allsales = LOAD 'sales' AS (name, price);
# 不需要指定列名称
allsales = LOAD 'sales';
# 您可以将备用分隔符指定为PigStorage的参数
# 此示例显示如何加载逗号分隔的数据
allsales = LOAD 'sales.csv' USING PigStorage(',') AS (name, price);
# 或者加载管道分隔的数据而不指定列名称
allsales = LOAD 'sales.txt' USING PigStorage('|');
# 基本数据分析
# Pig支持几种基本数据类型
# Pig将未指定类型的字段视为字节数组
allsales = LOAD 'sales' AS (name, price);
# 对于简单值,Pig中有八种数据类型
# Pig将尽最大努力根据上下文来确定数据类型
# 但是,最好在可能的情况下明确指定数据类型
allsales = LOAD 'sales' AS (name:chararray, price:int);
# 选择正确的数据类型对于避免精度损失很重要
# 重要提示:避免使用浮点数表示货币!
# 遇到无效数据时,Pig将值替换为NULL
# IS NULL和IS NOT NULL运算符测试空值
# 您可以使用这些运算符过滤坏记录
hasprices = FILTER Records BY price IS NOT NULL;
# 基本数据分析
# 关系数据库具有表,行,列和字段
# 我们将使用以下数据来说明Pig的等价物
# 单个数据元素称为字段
# 值的集合称为元组
# 元组的集合称为包
# 默认情况下,包中的元组是无序的
# 关系只是一个具有指定名称(别名)的包
# 典型的脚本将一个或多个数据集加载到关系中
最终结果通常也是一个关系,存储为输出
allsales = LOAD 'sales' AS (name, price);
bigsales = FILTER allsales BY price > 999;
STORE bigsales INTO 'myreport';
# 基本数据分析
Pig Latin语法
# 用于处理输出的命令取决于输出的目标
# DUMP输出示例,使用之前显示的文件中的数据
括号和逗号表示具有多个字段的元组
(Alice,2999,us)
(Bob,3625,ca)
(Carlos,2764,mx)
(Dieter,1749,de)
(Étienne,2368,fr)
(Fredo,5637,it)
# STORE命令用于将数据存储到HDFS
类似于LOAD,但是写入数据而不是读取
# 与LOAD一样,PigStorage的使用是隐式的
字段分隔符也有一个默认值(tab)
STORE bigsales INTO 'myreport';
您还可以指定备用分隔符
STORE bigsales INTO 'myreport' USING PigStorage(',');
# 基本数据分析
Pig Latin语法
# DESCRIBE命令显示数据的结构,包括名称和类型
# 下面的Grunt会话显示了一个例子
# 基本数据分析
# FILTER关键字提取符合指定条件的元组
bigsales = FILTER allsales BY price > 3000;
# 您可以将条件用AND和OR组合
somesales = FILTER allsales BY name == 'Dieter' OR (price > 3500 AND price < 4000);
# Pig Latin中的任何类型都支持==运算符
alices = FILTER allsales BY name == 'Alice';
# Pig Latin支持通过Java正则表达式进行模式匹配
这是使用MATCHES运算符完成的
a_names = FILTER allsales BY name MATCHES 'A.*';
spammers = FILTER senders BY email_addr MATCHES '.*@example\\.com$';
# 过滤提取行,但有时我们需要提取列
这是使用FOREACH和GENERATE关键字在Pig Latin中完成的
twofields = FOREACH allsales GENERATE amount, trans_id;
# FOREACH和GENERATE关键字也可用于创建字段
t = FOREACH allsales GENERATE price * 0.07;
# 可以命名这样的字段
t = FOREACH allsales GENERATE price * 0.07 AS tax;
# 还可以指定数据类型
t = FOREACH allsales GENERATE price * 0.07 AS tax:float;
# DISTINCT删除bag中的重复记录
unique_records = DISTINCT all_alices;
# 使用ORDER ... BY按升序对bag中的记录进行排序
sortedsales = ORDER allsales BY country DESC;
# 与在SQL中一样,您可以使用LIMIT来减少输出记录的数量
somesales = LIMIT allsales 10;
# 谨防! 记录排序是随机的,除非使用ORDER BY指定
使用ORDER BY和LIMIT一起查找前N个结果
sortedsales = ORDER allsales BY price DESC;
top_five = LIMIT sortedsales 5;
# 基本数据分析
Pig Latin语法
# 这些只是Pig的许多内置函数的一个示例
# 您可以通过FOREACH..GENERATE关键字来使用这些内置函数
rounded = FOREACH allsales GENERATE ROUND(price);
# 基本数据分析
# Pig Latin支持许多与SQL相同的操作
# 输入和输出的默认分隔符是制表符Tab字符
# 不需要指定字段的名称和类型
# 基本数据分析
# 在本章中,您将学习
# 用Pig处理复杂数据
# 我们已经看到PigStorage加载和存储数据
allsales = LOAD 'sales' AS (name, price);
默认分隔符(制表符Tab)可以轻松更改
allsales = LOAD 'sales' USING PigStorage(',') AS (name, price) ;
# 有时您需要加载或存储其他格式的数据
# 这里有几个Pig的内置函数用于加载其他格式的数据
# 一些函数加载数据,一些存储数据,还有一些函数两者都做
# 用Pig处理复杂数据
# 我们已经看到了Pig的三种复杂数据类型中的两种
# Pig还支持另一种复杂类型:映射
# 重要的是要知道如何在Pig中定义和识别这些类型
# 复杂数据类型可用于任何Pig字段
# 以下示例显示包是如何存储在文本文件中的
# 这里是相应的LOAD语句指定模式
details = LOAD 'salesdetail' AS (
trans_id:chararray, amount:int,
items_sold:bag
{item:tuple (SKU:chararray, price:int)});
# 以下示例显示映射是如何存储在文本文件中的
# 这里是相应的LOAD语句指定模式
credit = LOAD 'customer_accounts' AS (
name:chararray, account:map[], year:int);
# 思考具有以下数据的文件
Bob [salary#52000,age#52]
# 并加载以下模式
details = LOAD 'data' AS (name:chararray, info:map[]);
# 以下是在map和bag中引用数据的语法
salaries = FOREACH details GENERATE info#'salary';
# 用Pig处理复杂数据
# 有时您需要通过给定字段对记录进行分组
Alice 729
Bob 3999
Alice 27999
Carol 32999
Carol 4999
# 使用GROUP BY在Pig Latin中执行此操作
byname = GROUP sales BY name;
# 新关系总是包含两个字段
# 第一个字段在所有情况下都是字面上命名的组
# 第二个字段按照GROUP BY中指定的关系命名
# 下面的示例显示了分组后的数据
# 聚合函数从多个输入值创建一个输出值
# 我们只看到GROUP BY为每个唯一值创建一个记录
# GROUP ALL将所有数据放入一个记录
# 当需要聚合一个或多个列时,使用GROUP ALL
# Pig中的一些操作(如分组)会生成嵌套数据结构
# 分组可用于向聚合函数提供数据
# 但是,有时候你想使用一个“扁平”的数据结构
# 下面显示了嵌套数据和FLATTEN对它的影响
# 用Pig处理复杂数据
# Pig内置支持除SUM之外的其他聚合函数
# 例子:
# Pig有两个内置函数用于计数记录
# 这里有一些其他有用的Pig函数
# 用Pig处理复杂数据
# 我们已经看到FOREACH ... GENERATE遍历记录
# 目标是转换记录以产生新的关系
有时只选择某些列
price_column_only = FOREACH sales GENERATE price;
有时创建新列
taxes = FOREACH sales GENERATE price * 0.07; - 有时对数据调用一个函数
totals = FOREACH grouped GENERATE SUM(sales.price);
# 我们已经看到FOREACH ... GENERATE遍历记录
这通常用于在组中应用一系列变换
# 这称为嵌套FOREACH
# 我们的输入数据包含员工列表职位和相应的薪金
# 目标:确定每个职称内三个最高的工资
# 首先从文件加载数据
# 接下来,按职称对员工进行分组
# 嵌套FOREACH遍历每个记录(即每个作业标题)
# 用Pig处理复杂数据
# Pig有三种复杂的数据类型:tuple,bag和map
# 这些结构可以包含简单类型,如int或chararray
# Pig提供了对数据进行分组和取消分组的方法
# Pig提供了几个内置的聚合函数
# 用Pig处理复杂数据
# 在本练习中,您将分析来自Dualcore的在线广告系列的数据
# 有关说明,请参阅实践练习手册
# 在本章中,您将学习
# 使用Pig的多数据集操作
# 到目前为止,我们集中在处理单个数据集
# Pig提供了几种实现这一点的技术
# 我们将在本章中讨论这些内容
# 本章中的大多数示例将涉及相同的两个数据集
# 第一个是包含有关Dualcore的商店信息的文件
# 此关系中有两个字段
1.store_id:chararray(主键)
2.商店所在城市的名称
# 我们的其他数据集是一个包含有关Dualcore销售人员信息的文件
# 此关系包含三个字段
1.person_id:int(主键)
2.name:chararray(销售员名称)
3.store_id:chararray(指商店)
# 我们之前学到了GROUP运算符
# GROUP运算符还可以对多个关系进行分组
grouped = COGROUP stores BY store_id, salespeople BY store_id;
# 这会将两个数据集中的值收集到一个新关系中
如前所述,新关系由一个名为group的字段键入
此组字段与每个输入的一个包相关联
# 使用Pig的多数据集操作
# COGROUP运算符创建嵌套数据结构
# Pig Latin JOIN运算符创建一个平面数据结构
# JOIN类似于执行COGROUP,然后是FLATTEN
# 像COGROUP一样,连接依赖于由每个关系共享的字段
joined = JOIN stores BY store_id, salespeople BY store_id;
# 连接也可以使用多个字段作为键
joined = JOIN customers BY (name, phone_number),
accounts BY (name, phone_number);
# Pig Latin中的默认JOIN是内部连接
joined = JOIN stores BY store_id, salespeople BY store_id;
# 仅当在所有输入中找到键时,内部连接才输出记录
# 您可以在单个语句中对多个关系执行内部连接
# 与COGROUP一样,新关系仍包含重复字段
# 我们可以使用FOREACH ... GENERATE来保留我们需要的字段
# Pig Latin允许您指定字段名称后面的连接类型
# 外部连接不需要在两个输入中都找到键
# 外部连接需要Pig知道至少一个关系的模式
# 使用Pig的多数据集操作
# JOIN在一个关系中查找与另一个关系中的记录匹配的记录
# Pig的CROSS运算符创建两个关系的叉积
crossed = CROSS stores, salespeople;
# 小心:这可以产生大量的数据!
# 我们已经探索了用于组合数据集的几种技术
# UNION运算符垂直组合记录
# 这有助于将新数据合并到处理中
both = UNION june_items, july_items;
# 使用Pig的多数据集操作
# 您已经学习了将数据集合并到单个关系中的几种方法
# 有时您需要将数据集拆分为多个关系
# Pig Latin支持使用SPLIT运算符
SPLIT relation INTO relationA IF expression1,
relationB IF expression2,
relationC IF expression3...;
# 根据终身价值将客户分类进行奖励计划
# 使用Pig的多数据集操作
# 您可以使用COGROUP将多个关系分组
# Pig支持常见的SQL连接类型
# Pig的CROSS运算符创建输入数据的所有可能组合
# 您可以使用UNION来连接数据集
# 除了组合数据集,Pig还支持拼接它们
# 使用Pig的多数据集操作
# 在本练习中,您将使用Pig分析多个数据集
# 有关说明,请参阅实践练习手册
# 在本章中,您将学习
# Pig故障排除和优化
# 我们现在已经介绍了如何使用Pig进行数据分析
# 这里我们将介绍一些隔离和解决问题的技术
# 我们将在本章讨论pig命令的一些选项
# 一个有用的选项是-c(check),它验证代码的语法
$ pig -c myscript.pig
myscript.pig syntax OK
# 如果使用参数或宏,-dryrun选项将非常有用
$ pig -p INPUT=demodata -dryrun myscript.pig
# 有时你可能需要他人的帮助
# 您可能需要提供您正在使用的Pig和Hadoop的版本
$ pig -version
Apache Pig version 0.12.0-cdh5.2.0
$ hadoop version
Hadoop 2.5.0-cdh5.2.0
# Pig故障排除和优化
# 您可能希望更改记录的信息量
# Pig和Hadoop使用Log4J库,这是很容易定制的
# 编辑/etc/pig/conf/log4j.properties文件包括:
log4j.logger.org.apache.pig=ERROR
log4j.logger.org.apache.hadoop.conf.Configuration=ERROR
# 编辑/etc/pig/conf/pig.properties文件以设置此属性:
log4jconf=/etc/pig/conf/log4j.properties
# 你只想临时更改日志级别
# 您可以指定在调用Pig时使用的Log4J属性文件
# 创建customlog.properties文件包括:
log4j.logger.org.apache.pig=DEBUG
# 通过Pig的-log4jconf参数指定此文件
$ pig -log4jconf customlog.properties
# 当作业失败时,Pig可能会生成一个日志文件来解释为什么
# 要使用其他位置,请在启动Pig时使用-l(log)选项
$ pig -l /tmp
# 或通过编辑/etc/pig/conf/pig.properties永久设置
使用log.file属性指定其他目录
log.file=/tmp
# Pig故障排除和优化
Pig故障排除
# 每个Hadoop守护进程都有一个相应的Web应用程序
# JobTracker提供了最有用的Hadoop的Web UI
# JobTracker Web UI还显示历史信息
# 作业详细信息页面可以帮助您解决问题
# Hadoop集群通常是共享资源
# 我们建议在脚本中使用名称来帮助识别您的作业
grunt> set job.name 'Q2 2013 Sales Reporter';
# 处理大量数据的作业可能需要几个小时才能完成
# 首先,在JobTracker Web UI的首页上找到作业ID
# 然后,在Pig中使用kill命令以及该作业ID
grunt> kill job_201303151454_0028
# Pig故障排除和优化
# 如果时间允许,您的教师现在将演示如何使用JobTracker Web UI来隔离我们的代码中导致作业失败的错误
# 代码和指令已经在VM上
$ cd ~/training_materials/analyst/webuidemo
$ cat README.txt
# Pig故障排除和优化
# 您的代码可能在生产中处理百万兆字节的数据
# 使用SAMPLE从数据集中选择一组随机记录
# 此示例从大数据中选择大约5%的记录
将它们存储在一个名为mysample的新目录中
everything = LOAD 'bigdata';
subset = SAMPLE everything 0.05;
STORE subset INTO 'mysample';
# 有时,随机样本可能缺少测试所需的数据
例如,对于JOIN操作,匹配两个数据集中的记录
# Pig的ILLUSTRATE关键字可以做更多的智能采样
# 您应该在使用ILLUSTRATE时指定模式
# 像DUMP和DESCRIBE,ILLUSTRATE帮助调试
# 经常使用DUMP,DESCRIBE和ILLUSTRATE
# 看一下数据的样本
# 跟踪问题的其他有用步骤
# Pig故障排除和优化
# 我们已经讨论了几种用于在Pig Latin代码中查找错误的技术
# 性能调整是一个广泛和复杂的主题
# 这些主题大多超出了本课程的范围
# Pig故障排除和优化
# Pig Latin代码最终在Hadoop集群上作为MapReduce作业运行
# 但是,Pig不会将您的代码转换为Java MapReduce
# EXPLAIN关键字详述了Pig的三个执行计划
# 查看示例作业将有助于我们理解EXPLAIN的输出
# 我们的目标是产生每个店铺的销售清单
# 使用EXPLAIN而不是DUMP将显示执行计划
# Pig故障排除和优化
# Pig不一定像你写的那样运行你的语句
# 它可能会删除操作的效率
sales = LOAD 'sales' AS (store_id:chararray, price:int);
unused = FILTER sales BY price > 789;
DUMP sales;
# 它还可以重新整理操作以提高效率
grouped = GROUP sales BY store_id;
totals = FOREACH grouped GENERATE group, SUM(sales.price);
joined = JOIN totals BY group, stores BY store_id;
only_a = FILTER joined BY store_id == 'A';
DUMP only_a;
# Pig的优化器可以提高性能
# 在接下来的几张幻灯片中,我们将重写这个Pig代码的性能
stores = LOAD 'stores' AS (store_id, name, postcode, phone);
sales = LOAD 'sales' AS (store_id, price);
joined = JOIN sales BY store_id, stores BY store_id;
DUMP joined;
groups = GROUP joined BY sales::store_id;
totals = FOREACH groups GENERATE
FLATTEN(joined.stores::name) AS name,
SUM(joined.sales::price) AS amount;
unique = DISTINCT totals;
region = FILTER unique BY name == 'Anchorage' OR name == 'Edmonton';
sorted = ORDER region BY amount DESC;
topone = LIMIT sorted 1;
STORE topone INTO 'topstore';
# 在这种情况下,我们忘记删除DUMP语句
# 在加载数据时指定模式消除了Pig猜测的需要
# 商店数据集中的邮政编码和电话字段也从未使用过
# 我们以前在我们的FILTER之前做了我们的JOIN
# Hadoop集群通过并行处理数据来扩展
# 我们可以通过最后指定更大的数据集来优化连接
# 主题:尽早消除不必要的数据
# 在JOIN之前删除具有NULL键的记录可以提高性能
# Pig故障排除和优化
# 您可以通过在处理期间消除不必要的数据来提高性能
# Pig的错误消息并不总是清楚地标识问题的根源
# 这些资源帮助您解决问题
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |