`

Apache Pig的一些基础概念及用法总结(2)

    博客分类:
  • pig
 
阅读更多

本文可以让刚接触pig的人对一些基础概念有个初步的了解。
本文的大量实例都是作者Darran Zhang(website: codelast.com)在工作、学习中总结的经验或解决的问题,并且添加了较为详尽的说明及注解,此外,作者还在不断地添加本文的内容,希望能帮助一部分人。
要查看Pig系列教程,请点击【这里】

Apache pig是 用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程 序的难度要小N倍,实现同样的效果的代码量也小N倍。Twitter就大量使用pig来处理海量数据——有兴趣的,可以看Twitter工程师写的这个PPT
但是,刚接触pig时,可能会觉得里面的某些概念以及程序实现方法与想像中的很不一样,甚至有些莫名,所以,你需要仔细地研究一下基础概念,这样在写pig程序的时候,才不会觉得非常别扭。

本文基于以下环境:
pig 0.8.1

先给出两个链接:pig参考手册1pig参考手册2。本文的部分内容来自这两个手册,但涉及到翻译的部分,也是我自己翻译的,因此可能理解与英文有偏差,如果你觉得有疑义,可参考英文内容。

(1)LIMIT操作并不会减少读入的数据量
如果你只需要输出一个小数据集,通常你可以使用LIMIT来实现,例如:

1
2
3
A = LOAD '1.txt' AS (col1: int, col2: chararray);
B = LIMIT A 5;
DUMP B;

Pig会只加载5条记录,就不再读取其他的记录了吗?答案是:不会。Pig将读取数据文件中的所有记录,然后再从中挑5条。这是Pig可以做优化、却没有做的一点。
【更新】Pig 0.10已经有了这功能了:

Push Limit into Loader
Pig optimizes limit query by pushing limit automatically to the loader, thus requiring only a fraction of the entire input to be scanned.
按我的理解,上面这段话的含义是:Pig将LIMIT查询自动优化到loader中,这样就只会扫描整个输入数据集的一部分(而不是全部)。

文章来源:http://www.codelast.com/
(2)使用UDF不一定要在Pig脚本中REGISTER,也可以在命令行指定
大家知道,使用UDF需要在Pig脚本中REGISTER该UDF的jar包,但你可能不知道,你也可以不在Pig脚本中REGISTER它,而是通过命令行指定:

1
pig -Dpig.additional.jars=/home/codelast/a.jar:/home/codelast/b.jar:/home/codelast/c.jar test.pig

以上命令告诉了我们几件事:
我们让Pig执行了test.pig脚本;
我们向Pig传入了“pig.additional.jars”这样一个参数,此参数的作用相当于在Pig脚本中REGISTER jar包;
如果你要REGISTER多个jar包,只需像上面的例子一样,用分号(:)把多个jar包路径隔开即可;
test.pig必须写在最后,而不能写成“pig test.pig -Dpig.additional.jars=XXX”这样,否则Pig直接报错:

ERROR 2999: Unexpected internal error. Encountered unexpected arguments on command line – please check the command line.

当然,为了可维护性好,你最好把REGISTER jar包写在Pig脚本中,不要通过命令行传入。

(3)使用ORDER排序时,null会比所有值都小
用ORDER按一个字段排序,如果该字段的所有值中有null,那么null会比其他值都小。

(4)如何按指定的几个字段来去重
去重,即去除重复的记录。通常,我们使用DISTINCT来去除整行重复的记录,但是,如果我们只想用几个字段来去重,怎么做?
假设有以下数据文件:

1
2
3
4
5
6
7
[root@localhost ~]$ cat 1.txt
1 2 3 4 uoip
1 2 3 4 jklm
9 7 5 3 sdfa
8 8 8 8 dddd
9 7 5 3 qqqq
8 8 8 8 sfew

我们要按第1、2、3、4个字段来去重,也就是说,去重结果应为:

1
2
3
1 2 3 4 uoip
9 7 5 3 sdfa
8 8 8 8 dddd

那么,我们可以这样做:

1
2
3
4
5
6
7
A = LOAD '1.txt' AS (col1: chararray, col2: chararray, col3: chararray, col4: chararray, col5: chararray);
B = GROUP A BY (col1, col2, col3, col4);
C = FOREACH B {
  D = LIMIT A 1;
  GENERATE FLATTEN(D);
};
DUMP C;

文章来源:http://www.codelast.com/
输出结果为:

1
2
3
(1,2,3,4,uoip)
(8,8,8,8,dddd)
(9,7,5,3,sdfa)

代码很简单,就是利用了GROUP时会自动对group的key去重的功能,这里不用多解释大家应该也能看懂。

(5)如何设置Pig job的名字,使得在Hadoop jobtracker中可以清晰地识别出来
在Pig脚本中的一开始处,写上这一句:

1
set job.name 'This is my job';

将使得Pig job name被设置为“This is my job”,从而在Hadoop jobtracker的web界面中可以很容易地找到你的job。如果不设置的话,其名字将显示为“PigLatin:DefaultJobName”。

(6)scalar has more than one row in the output”错误的一个原因
遇到了这个错误?我来演示一下如何复现这个错误。
假设有两个文件:

1
2
3
4
5
6
[root@localhost ~]$ cat a.txt
1 2
3 4
[root@localhost ~]$ cat b.txt
3 4
5 6

现在我们来做一个JOIN:

1
2
3
4
5
A = LOAD 'a.txt' AS (col1: int, col2: int);
B = LOAD 'b.txt' AS (col1: int, col2: int);
C = JOIN A BY col1, B BY col1;
D = FOREACH C GENERATE A.col1;
DUMP D;

这段代码是必然会fail的,错误提示为:

1
org.apache.pig.backend.executionengine.ExecException: ERROR 0: Scalar has more than one row in the output. 1st : (1,2), 2nd :(3,4)

文章来源:http://www.codelast.com/
乍一看,似乎代码简单得一点问题都没有啊?其实仔细一看,“A.col1”的写法根本就是错误的,应该写成“A::col1”才对,因为你只要 DESCRIBE 一下 C 的schema就明白了:

1
C: {A::col1: int,A::col2: int,B::col1: int,B::col2: int}

Pig的这个错误提示得很不直观,在这个链接中也有人提到过了。

(7)如何输出LZO压缩格式的文本文件
还是借助于elephant-bird,可以轻易完成这个工作:

1
2
A =LOAD 'input';
STORE A INTO 'output' USING com.twitter.elephantbird.pig.store.LzoPigStorage();

结果就会得到一堆名称类似于“part-m-00000.lzo”的文件。
注意以上省略了一堆的“REGISTER XXX.jar”代码,你需要自己添加上你的jar包路径。
有人说,那加载LZO压缩的文本文件呢?很简单:

1
A = LOAD 'output' USING com.twitter.elephantbird.pig.store.LzoPigStorage(',');

这表示指定了分隔符为逗号,如果不想指定,省略括号中的内容即可。

(8)如何输出 gz 及 bz2 压缩格式的文件
首先请看这个链接的说明。摘录一段话:

Compression
 
Storing to a directory whose name ends in ".bz2" or ".gz" or ".lzo" (if you have installed support for LZO compression in Hadoop) will automatically use the corresponding compression codec.
output.compression.enabled and output.compression.codec job properties also work.
Loading from directories ending in .bz2 or .bz works automatically; other compression formats are not auto-detected on loading.
说得简单点就是:当你把保存的目录名设置为以 .bz2 或 .gz 结尾时,输出的文件就自动会被压缩为对应的文件格式。
因此,我就有了下面这两段极其简单的示例代码:
1
2
3
4
5
6
7
--压缩率稍低
A = LOAD '1.txt';
STORE A INTO 'z.gz';
 
--压缩率较高
A = LOAD '1.txt';
STORE A INTO 'z.bz2';

正如上面的注释所示,bz2 的压缩率比 gz 高。
最后生成的目录下,文件名类似于:

1
2
3
part-m-00000.gz
part-m-00001.gz
part-m-00002.gz

如果是 bz2,则后缀名为 .bz2。

分享到:
评论

相关推荐

    [原创]Apache_Pig的一些基础概念及用法总结

    ### Apache Pig的基础概念及用法总结 #### 一、引言 Apache Pig是一种高级的数据流语言,用于在Hadoop平台上处理大规模数据集。它通过提供一种抽象层,简化了复杂的大规模数据处理任务,使用户能够更加专注于数据...

    Apache Pig用法总结

    Apache Pig是一个开源的平台,它为用户提供了一种高级查询语言,即Pig Latin,用于处理大规模数据集。Pig Latin抽象了MapReduce编程模型,从而使得数据分析师能够轻松地编写数据转换脚本,而无需深入Java编程。Pig...

    基于hadoop平台的pig语言对apache日志系统的分析

    标题 "基于Hadoop平台的Pig语言对Apache日志系统的分析" 涉及到的主要知识点包括Hadoop、Pig语言以及Apache服务器日志的处理。以下是对这些关键概念的详细解释: 1. Hadoop平台: Hadoop是Apache软件基金会开发的...

    Programming Pig(pig编程).pdf

    对于想要开始使用Pig的读者,书中的内容会从下载Pig包开始讲起,包括从Apache、Cloudera、Maven仓库等不同途径获取Pig的方法,以及安装和运行Pig的基本步骤。这本书还可能涉及如何设置和配置Pig环境、使用Pig Latin...

    apache doc

    4. **Apache Spark文档**:Spark是大数据处理的快速计算引擎,其文档提供了关于Spark核心概念(如RDD、DataFrame、Dataset)的介绍,以及Spark SQL、Streaming、MLlib机器学习库和GraphX图处理库的使用指南。...

    Apache Hadoop---Crunch.docx

    它不局限于 Pig 和 Hive 所使用的元组模型,而是允许与诸如 Apache Avro records 和 protocol buffers 这样的复杂数据结构进行交互。这使得处理结构化和半结构化数据变得更加方便。 Crunch 相较于 Pig 的优势在于它...

    Pro Apache Hadoop, 2nd Edition

    《Pro Apache Hadoop, 2nd Edition》是一本专门介绍Apache Hadoop第二版的专业书籍。Hadoop是一个开源框架,旨在从大型数据集中进行存储和处理的分布式系统。它允许开发者使用简单的编程模型在计算机集群上分布式地...

    Pro Apache Hadoop 2nd Edition 2014

    本书共包含17个章节及三个附录,涵盖了从Hadoop的基础概念到高级应用的各个方面: 1. **第1章:大数据的动机** - 本章旨在阐述大数据时代的需求及其背后的推动力。它讨论了大数据产生的原因、处理大量数据所面临的...

    7.Hadoop入门进阶课程_第7周_Pig介绍、安装与应用案例.pdf

    通过上述内容,我们不仅了解了Pig的基本概念和使用方法,还学会了如何在实际环境中搭建Pig环境以及如何利用Pig进行数据分析。这对于希望深入学习Hadoop生态系统并掌握大数据处理技术的学习者来说是非常有价值的。

    Apache Hadoop---Ambari.docx

    Apache Ambari 是一款强大的开源工具,专门设计用于简化Apache Hadoop生态系统的集群管理与监控。它通过一个直观的Web界面提供了丰富的功能,使管理员能够轻松地供应、配置、管理和监控Hadoop集群。Hadoop在这里指的...

    debug-pig:调试猪脚本的例子

    在IT行业中,尤其是在大数据处理领域,Pig Latin是一种高级数据处理语言,用于构建大型的数据处理作业,它由Apache Pig项目提供。"Debug Pig"是指在编写和执行Pig Latin脚本时进行问题排查的过程。本篇文章将深入...

    大数据基础编程、实验和案例教程

    接着,可能深入讲解了使用Java或者Python实现MapReduce程序的方法,这两种语言在大数据领域广泛应用。 此外,教程可能会涵盖Pig和Hive这两种基于Hadoop的数据处理工具。Pig提供了一种高级语言Pig Latin,简化了...

    Cloudera大数据分析培训内容介绍.pdf

    此外,还会深入探讨处理复杂数据的方法,如存储格式、嵌套数据类型、群组处理和使用自定义函数(UDFs)来扩展Pig的功能。 **Apache Hive**:Hive是一个基于Hadoop的数据仓库工具,提供了SQL-like查询语言HiveQL,...

    Hadoop大数据开发基础

    **Hadoop大数据开发基础** Hadoop是Apache软件基金会的一个开源框架,专为处理和存储大量数据而设计。它以其分布式文件系统(HDFS)和MapReduce计算模型为核心,为企业和研究机构提供了处理海量数据的能力。这份名...

    大数据基础及进阶+面试指南

    【大数据基础及进阶+面试指南】这个主题涵盖了大数据处理的核心概念、技术栈以及与之相关的面试准备。在Java项目背景下,我们主要关注如何利用Java技术处理和分析大规模数据。 大数据基础部分通常包括以下几个关键...

    学习hadoop--java零基础学习hadoop手册

    #### 一、Hadoop简介及Java基础知识 **标题**:“学习hadoop--java零基础学习hadoop手册” **描述**:“学习hadoop--java零基础学习hadoop手册” 本手册旨在为完全没有Java基础的学习者提供一个从零开始学习Hadoop...

    大数据专业术语,你知道几个?.docx

    6. Apache Pig:在大型分布式数据集上创建查询执行例程的平台,使用的脚本语言叫做 Pig Latin。 7. Apache Storm:Hadoop 进行批处理的瞬时处理,使用 Storm 可以实时处理大量数据。 8. 机器学习:是人工智能开发...

    Cloudera基础培训材料.pdf

    基本模式示例部分,将通过具体的代码或配置示例,展示Avro模式的定义和使用方法。这有助于学习者理解如何在实际应用中定义和使用Avro模式。 选择文件格式的考虑因素部分,将指导学习者如何根据数据处理需求选择合适...

Global site tag (gtag.js) - Google Analytics