当前课程知识点:大数据系统基础 >  4. 处理框架 >  授课视频 >  4.10Pig Latin 嵌套数据类型

返回《大数据系统基础》慕课在线视频课程列表

4.10Pig Latin 嵌套数据类型在线视频

4.10Pig Latin 嵌套数据类型

下一节:4.11Pig Latin 实现与优化

返回《大数据系统基础》慕课在线视频列表

4.10Pig Latin 嵌套数据类型课程教案、知识点、字幕

关于PIG LATIN的语法

它实际上是非常简单的

但是比较值得一提的是

它的数据结构

尤其是它这个比较嵌套的

数据结构

这一点跟数据库里头

还是有相当大的差别的

大家知道数据库的表

一般来讲它是一行

一行它是一个扁平的结构

它是多少列

一般来讲我们不推荐

在一个 一行的一列里头

放多个不同的值

就放一个数组在里头

那个一般来讲

在数据库里头

它是不推荐的一种做法

但是PIG LATIN它采取的是

完全可以嵌套的数据模型

那么它里头有一系列的这种

叫(00:38)type

就是说它是有一系列的能够

表示一组数据的这样的类型

比如说像tuples

比如说像bags或者叫lists

或者叫maps它有各种不同的

可以表示一组数据

数据集合这种的模型

所以它是完全支持这样的

就是说这个域里头只有一个值

是一个Atomic Values

是一个原子值

那这个域里头就是一个列表

所以它是好多个值

放到一个域里头

这个实际上虽然跟传统的

数据库不一样

但是实际上对人来说

对程序员来说

实际上这个是一种比

扁平的这种数据库的格式

要更自然

因为大家觉得跟yahoo对应的

它就是有这一组值

你非要把它yahoo复制三份

然后把它放在不同的组里头

或者你

比如说你要是学过数据库的话

你要想到那些范式什么的

非要把这个表拆成好几个表

这时候你不光做得会比较的

这个麻烦

人不容易理解

而且会造成很多不需要的这个

Join的操作

为什么

因为如果你把这个表打开

你为了不想让

把yahoo这个词重复三遍

那你一会儿要把它分成两个表

第一个表里头写的你有一个ID

1叫做yahoo

然后这个表里头写的是

那么1对应的另外一个表

这个表写的1对应的是finance

1对应的是email等等等等

然后你要想知道

yahoo和email放到一起

你比较得在这个1上做一个Join

所以它就相当于白白地

做了一次Join的操作

只是为了防止这个yahoo

被重复多遍

防止把所有的这些东西

都塞到一个

作为一个数组塞到

一个域里头去

但是这种嵌套的数据模型

现在很多做大数据的处理的

因为做Join实在是太昂贵了

在小的数据里头Join

其实也昂贵

但是大家还是觉得

这是可以接受的

我们为了防止这个数据的重复

因为重复的数据

有很多管理的问题

比如说你改变一个副本的话

你得保证所有的副本一起改变

这有很多其他的问题

但是基于这些问题

大家觉得我宁愿多做一些Join

没关系

那大数据谁也不愿意

做这些Join

所以我们大部分大数据的

这个系统都是支持嵌套模型的

那嵌套的模型比如说怎么做呢

比如说group by这个操作

group by这个操作在传统的

在数据库里头

group by你是不能单独做的

因为它group by的结果它

根据定义

那么就是一个key

带着一团数据

这些数据都是有着相同的key

才把它group在一起嘛

这叫group by的定义

就是这样的

但是因为传统的数据库

它不能够表示你的这个

好多个值在同一个行里头

或者跟着同一个key

所以在传统的数据库

就是大家考虑的(03:11)

考虑(03:12)这些东西的话

它必须要求group by后边跟着

一个(03:15)

否则的话它那个编译器

会出错的

就比如说你group by完了之后

你必须求个平均值

或者你必须求个median(03:22)

你必须求一个和 求个

你必须

反正把这些数据集合起来

这样的话让它变成

还是变成一行里只有一个值

但是PIG LATIN因为它支持

嵌套的数据模型

所以无所谓

你group by完了之后

它group by的结果就是一个

group的key加上一个数组

这个数组里都是你的这个值

这样就有什么好处呢

这样的好处就是说

你group by完了之后

如果你不想把它求和

而只是你想对每一个组

你比如说求tap ten这件事情

那么它返回的结果还是有10个

那你可以说

你就可以写foreach foreach什么

foreach你group by的结果

就foreach这个table那么为什么

foreach table了

后边还可以做

就是因为你foreach的话

那每一个each 每一个元素

那么里头还是一个数组

所以你可以在这个数组上

做很多的操作

这样的话

实际上group by

这为什么叫解耦了grouping
就是把grouping和这个(04:15)

这两个本身没有

特别大关系的操作

把它分开了

这样你group了之后

不一定要做(04:20)

这是能够支持

嵌套的数据模型的

一个重要的操作

这个还有一个重要的操作

叫做CoGroup

那么CoGroup可以理解为

是一种广义的grouping

这里举一个例子

比如说

因为PIG是用来分析广告的

所以这种例子很多

都是跟广告的这种排名有关系

比如说第一个表里头显示了

如果大家查询

就是搜索的时候

我搜索这个Lakers湖人队

如果搜索Lakers的话

那么我打出来的广告

排第一的是nba.com

那么它是广告排名在第一

如果搜Lakers的话

espn是美国的一个体育频道

那么它的排名可能是第二

这个广告排名是根据一些

竞价一些什么来的

它记住了这个结果

我搜索这个词的时候

它排名第几

另外一个表记录了

它的广告收入是多少钱

那么什么意思呢

就是说如果这个Lakers的这个

这个查询

在这种情况下

如果我广告位显示在广告页面

顶端的那个广告栏上

那么它收了50块钱

那么它显示在边上的那个广告

它收了20块钱

它就是这么一个意思

那么我们想

它这是两个不同的表

一个是结果的排名

一个是它能够放在什么地方

它能收入多少

但是我如果想把这两个东西

联合起来看

我想看一看它在不同的

排名结果

和不同的显示位置情况下

那它的收入到底是什么样子呢

我们就可以实行这样一个

PIG操作

CoGroup是PIG里头的

一个操作的名字

我group了两个表

哪两个表呢

一个表叫results

这个是叫results

然后这个表就叫revenue

所以我把这两个表group在一起

然后results我用的是

queryString

那么就是这个queryString

revenue也用的queryString
就是这个String

这个group之后的结果是什么

那group的key
那当然就是这个by什么的

就是什么的key了

那就是group by Lakers
那么对Lakers来说

它就是后边它是跟着是两个表

每个表里头都有不同的值

那么它都是跟Lakers有关系的

所以你看这个

它这会儿跟Lakers有关的

这些东西都放在一起
跟Lakers有关的东西

都放在一起了

那它实际上相当于把两个表

排了一下序

但是它用的是前头得group

这个东西有什么好处

因为传统来讲

你就要来做个Join

你怎么样把两个东西

搁在一起看

把这个表的东西

和这个表的东西搁在一起看呢

那么你就要做一个Join

这个Join是Join on这个queryString

就是Join on这第一个域的

所以那么你得出的是什么

这种东西的Join

基本上你得出的是一个

cross product的

实际上是一个叉乘的

这么的一个结果

因为如果这个表Lakers

所以这个有两个Lakers

其中这个表里有两个Lakers

那么它们Join的结果是几行

实际上是四行

因为nba.com对top是多少钱

nba.com在side是多少钱

espn.com到top是多少钱
espn.com在side是多少钱

所以这种模式出来的

是四行的结果

所以它做完了之后

它是把整个的重复了两遍

然后是四行

底下的这也是一样的

这个是可以的

在数据库里

大家也都是这样做的

然后你再想选出哪几行来

然后你就再去

根据那几行一选就行了

但是这个东西它是无意义地

计算了一个cross product

万一如果用户做完了

这件事之后

他并不想把每两个东西

都组合在一起

万一他用户还有一些个

更加(07:36)

或者说更加的自身定义的

一些(07:39)的方式

你非要把它Join在一起

反而对它来讲

就是一个浪费了这个Join

然后它要再把它重新洗开

洗干净洗开了

因此它这种CoGroup

还是给用户两个表的抽象

这儿有一个表

这儿有一个表

他可以自己再写一个操作

他对这个表做一下处理

对这个表做一下处理

然后剩下的一点点小的

再Join在一起

这个也是一种非常重要的

性能上的优化

因此我们的结论是什么

这个数据一大了

有些个操作

你在数据库里看起来

是非常非常容易的一些操作

我们往往要把它切得更细

为什么

因为这一个Lakers

可能这里头有无数无数个

results

这个表也可能很大

然后你一求叉乘

历史里的内存或者是硬盘

磁盘就爆了

所以它能不求就不能求

能不用算的东西

就不要算

因为用户可能有更聪明的办法

在中间你还没算的过程中

就帮你把这个结果解决了

所以你就不用再算了

所以它要一定要保存这样的中间结果

所以这是一个

叫CoGroup的过程

它也是为什么我们一定要支持

嵌套的数据结构的

一个重要的原因

大数据系统基础课程列表:

1. 绪论

-授课视频

--什么是大数据

--大数据典型应用

--大数据的特点

--大数据技术体系

--大数据生态系统

--大数据技术挑战

--课程内容

-1. 绪论--Quiz 1

2.云计算

-授课视频

--2.1大数据和云计算关系概述

--2.2并行化理念

--2.3规模经济理念

--2.4从仓库规模计算机到云

--2.5云计算商业模式概述

--2.6云计算带来的价值

--2.7云计算的分类

--2.8虚拟化技术概述

--2.9计算虚拟化

--2.10网络虚拟化:基础

--2.11网络虚拟化:软件定义网络

--2.12软件定义网络实现

--2.13存储虚拟化:用户接口

--2.14存储虚拟化:分布式存储实现方式

--2.15虚拟化技术总结

--2.16OPENSTACK

--2.17云计算小结

-2.云计算--Quiz 2

3.文件存储

-授课视频

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

-3.文件存储--Quiz3

4. 处理框架

-授课视频

--4.1大数据的处理框架

--4.2MapReduce编程模型

--MapReduce执行过程

--4.4MapReduce数据流

--4.5MapReduce性能优化与容错

--4.6Hadoop

--4.7MapReduce总结

--4.8Pig Latin

--4.9Pig Latin语法

--4.10Pig Latin 嵌套数据类型

--4.11Pig Latin 实现与优化

--Pig Latin 实现与优化(2)

--4.13类似框架

--4.14章节总结

-4. 处理框架--Quiz4

5.内存计算

-授课视频

--5.1内存计算概述

--5.2并行计算挑战

--5.3并行计算的局限性

--5.4大数据处理并行系统

--5.5内存计算需求

--5.6MapReduce文件传递数据

--5.7内存计算的可行性

--5.8内存层次的延迟

--5.9内存计算实例-spark

--5.10SPARK-RDD

--5.11大数据并行系统

--5.12Spark编程接口

--5.13Spark编程实例——Log挖掘

--5.14Spark编程实例——WorkCount

--5.15Spark实现技术

--5.16复杂的DAG示例

--5.17RDD性能的提高

--5.18Spark应用和生态环境

--5.19Spark的局限性

-5.内存计算--Quiz5

6. NoSQL

-授课视频

--NoSQL与Cassandra

--数据模型、接口、语言

--系统架构与Gossip协议

--一致性哈希与数据分区

--数据副本及一致性

--节点本地数据存储

-6. NoSQL--Quiz6

7. 流计算

-授课视屏

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

--Video

-7. 流计算--Quiz7

4.10Pig Latin 嵌套数据类型笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。