码迷,mamicode.com
首页 > 其他好文 > 详细

Pig Latin介绍

时间:2015-05-09 10:17:52      阅读:5156      评论:0      收藏:0      [点我收藏+]

标签:编程

背景

  当下很多公司都依赖于数据分析来提升产品质量。各种各样的数据库构架(比如并行数据库)正应对了这样的需求,但其缺点是技术人员必须依赖SQL这样远不如其他编程语言方便的语言来处理数据。所以很多人都选择了MapReduce,因为这种模式下只需要设计Map和Reduce两个方程就够了,但是难以重复使用,维护,和优化也是这种模式的缺陷。
  在这样的情况下,兼顾两者优点的Pig Latin应运而生。

Pig Latin的语言特点

  Pig Latin让用户每次只输入一条单独的语句,这条单独的语句只执行一个简单的数据处理。这区别于SQL,SQL要求用户一次性输入一条完成所有计算任务的语句。PigLatin对需要处理超大数据量的技术人员很有用。同时PigLatin系统还能够像数据库那样优化语句。
  在用PigLatin作数据分析的时候,不需要经过耗时的数据加载过程。经过分析后的数据还可以以不同的格式输出,适应不同的应用。PigLatin和传统数据库有一个很大差别,PitLatin不需要数据加载,原因是PitLatin只支持数据读取,这样数据的一致性(consistency)需求就没有了,而且数据分析通常是分析完之后数据就不再需要了。PigLatin支持但不要求程序员设计数据概要(schema)。
  PigLatin也支持自定义方程来让程序员执行某些特殊的数据处理。

Debugging支持

  对于大规模数据分析,如果通过一般的运行测试来debug,那将极其耗时,因为运行一次程序要花费大量的时间。
  为了解决这个问题,PigLatin在程序的每一步自动生成并更新一批与原数据相仿的样本数据。这样就可以利用这些数据事先debug。

数据模型

  Pig包含四种数据类型:
  1. atom:包含一个最小单位的数据,例如字符串或数字,
  2. tuple:一组任意类型的值,
  3. bag:多个不同的或相同的tuple组成,
  4. map:key/value对,key属于最小单位数据类型(atom),value可以是以上任意类型。

Pig Latin指令

加载数据

  数据文件要求以tuple的格式记录数据。加载数据同过LOAD指令来实现,举个例子:

queries = LOAD "query_log.txt"
          USING myLoad()
          AS (userId, queryString, timestamp);

  在上述例子中,LOAD指定数据文件名(query_log.txt)。数据通过myLoad()转换成一个个tuple,每个tuple包含三条数据信息:userID,queryString,timestamp。如果USING和AS省略,数据就会以默认的方式处理。
  LOAD处理完数据之后会生成一个包含bag的文件的handle,并将其赋值给queries变量。之后我们就可以通过queries变量来处理数据了。
  值得注意的是,LOAD并没有想数据库那样将数据读进来,而是指定了数据该如何读取,只有在用户需要使用数据的时候才会被真正加载进来。

处理tuple

  数据准备好了之后,就可用FOREACH指令处理每一个tuple了。比如:

expanded_queries = FOREACH queries GENERATE
                   userID, expandQuery(queryString);

  每一个tuple经处理会生成一个包含uerID和用自定义方程处理后的queryString的一个新tuple。

数据筛选

  筛选通过FILTER完成,例如:

real_queries = FILTER queries BY userId neq ‘bot‘;

数据归类

  像SQL中的GROUP BY一样,COGROUP可以将tuple组在一起。假设我们通过LOAD有两个组数据:

results: (queryString, url, position)
revenue: (queryString, adSlot, amount)

  我们可以通过下列语句将来自两组数据,queryString相同的tuple组在一起:

grouped_data = COGROUP resutls BY queryString,
                       revenue BY queryString;

  COGROUP用于多个数据组,当只有一个数据组的时候,我们可以用GROUP。对于以上例子,如果我们想在revenue里求出每一条queryString对应的总收入(amount),我们可以用:

grouped_revenue = GROUPE revenue BY queryString;
query_revenue = FOREACH grouped_revenue GENERATE
                queryString,
                SUM(revenue.amount) AS total_revenue;

JOIN

  Pig Latin可有JOIN语句:

join_result = JOIN results BY queryString,
                   revenue BY queryString;

MapReduce

  在Pig Latin里,MapReduce可以很简单的实现。Map方程每次处理一条tuple,最后输出一个包含key/value对的bag。Reduce方程处理每一个key下面的value。

结果输出

  将计算结果写入文件可以通过STORE指令:

STORE query_revenue INT ‘output‘
      USING myStore();

  上述指令根据myStore()将结果放入名为“output”的文件。如果不加USING,数据就以默认的方式输出存储。

其他指令

  Pig Latin的其他指令包括
  - UNION
  - CROSS
  - ORDER
  - DISTINCT
  同时,对于比较复杂的数据结构,例如tuple里面出现bag,Pig Latin还支持嵌套语句(nested operations)。

Implementation

  Pig Latin搭建在Hadoop平台上,而且和Hadoop一样,也是开源的。
  当用户输入一条指令的时候,Pig首先通过分析语句是否正确有效,然后编译成MapReduce任务。

更多资源(英文)

  Pig Latin论文
  

Pig Latin介绍

标签:编程

原文地址:http://blog.csdn.net/quantum_bit/article/details/45595781

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!