((3,0,5),{(a,3,0,5,3.5,2.1)})
((7,9,9),{(b,7,9,9,,),(a,7,9,9,2.6,6.2)})
可见,与前面所说的一样,组合(1,2,3)对应了两行数据,组合(7,9,9)也对应了两行
数据。
这个时候,B 的结构就不那么明朗了,可能与你想像中有一点不一样了。
文章来源:http://www.codelast.com/
③计算每一种组合下的最后两列的平均值。
根据上面得到的 B 的数据,你可以把 B 想像成一行一行的数据(只不过这些行不是对称的),
FOREACH 的作用是对 B 的每一行数据进行遍历,然后进行计算。
GENERATE 可以理解为要生成什么样的数据,这里的 group 就是上一步操作中 B 的第一项
数据(即 pig 为 A 的第 2、3、4 列的组合赋予的别名),所以它告诉了我们:在数据集 C 的
每一行里,第一项就是 B 中的 group——类似于(1,2,5)这样的东西)。
而 AVG(A.col5) 这样的计算,则是调用了 pig 的一个求平均值的函数 AVG,用于对 A 的名
为 col5 的列求平均值。前文说了,在加载数据到 A 的时候,我们已经给每一列起了个别名,
col5 就是倒数第二列。
到这里,可能有人要迷糊了:难道 AVG(A.col5) 不是表示对 A 的 col5 这一列求平均值吗?
也就是说,在遍历 B(FOREACH B)的每一行时候,计算结果都是相同的啊!
事实上并不是这样。我们遍历的是 B,我们需要注意到,B 的数据结构中,每一行数据里,一
个 group 对应的是若干个 A,因此,这里的 A.col5,指的是 B 的每一行中的 A,而不是包含全
部数据的那个 A。拿 B 的第一行来举例:
((1,2,3),{(a,1,2,3,4.2,9.8),(a,1,2,3,1.4,0.2)})
遍历到 B 的这一行时,要计算 AVG(A.col5),pig 会找到 (a,1,2,3,4.2,9.8) 中的 4.2,以及
(a,1,2,3,1.4,0.2)中的 1.4,加起来除以 2,就得到了平均值。
同理,我们也知道了 AVG(A.col6)是怎么算出来的。但还有一点要注意的:对(7,9,9)这个组,
它对应的数据(b,7,9,9,,)里最后两列是无值的,这是因为我们的数据文件对应位置上不是有效数
字,而是两个“-”,pig 在加载数据的时候自动将它置为空了,并且计算平均值的时候,也不会
把这一组数据考虑在内(相当于忽略这组数据的存在)。
到了这里,我们不难理解,为什么 C 的数据结构是这样的了:
C: {group: (col2: int,col
3: int,col4: int),double,double}
文章来源:http://www.codelast.com/
④DUMP C 就是将 C 中的数据输出到控制台。如果要输出到文件,需要使用:
这样 pig 就会在当前目录下新建一个“output”目录(该目录必须事先不存在),并把结果文件放
到该目录下。
请想像一下,如果要实现相同的功能,用 Java 或 C++写一个 Map-Reduce 应用程序需要多少
时间?可能仅仅是写一个 build.xml 或者 Makefile,所需的时间就是写这段 pig 代码的几十倍
了!
正因为 pig 有如此优势,它才得到了广泛应用。
文章来源:http://www.codelast.com/
(3)怎样统计数据行数
在 SQL 语句中,要统计表中数据的行数,很简单:
SELECT COUNT(*) FROM table_name WH
ERE condition
评论0
最新资源