hive count group by转pig语法

之前一直写hive,按某个字段分组统计条数用hive写非常简单
最近组里开始用pig,pig里的分组统计一直有点模糊,今天看了Stack Overflow上的一篇文章才算弄明白,记录一下。

例如数据如下

id, term
(10, smerter)
(10, graviditeten)
(10, smerter)
(10, smerter)
(10, udemrket)    
(20, eis feuer)
(20, herunterladen schau)
(20, download gratis)
(20, download gratis) 
(30, anschauen kinofilm)
(30, kauf rechnung)
(30, kauf rechnung)
(30, versandkostenfreie lieferung)
(30, kostenlose)
(30, kostenlose)
(30, kostenlose) 

想要的结果

(10, smerter, 3)
(10, graviditeten, 2)
(10, udemrket, 1)
(20, download gratis, 2)
(20, eis feuer, 1)
(20, herunterladen schau, 1)    
(30, kostenlose, 3)
(30, kauf rechnung, 2)
(30, anschauen kinofilm, 1)
(30, versandkostenfreie lieferung, 1)

首先看用hive怎么写,非常简单明了

select
id
,term
,count(1) as pv 
from table_a
group by id, term

用pig怎么写呢?看一下

-- 加载数据,字段之间用 \t 分隔
input_data = LOAD 'table_a' USING PigStorage ('\t') AS (id: int, term: chararray);

-- 按照 id 和 term 分组
data_group = GROUP input_data BY (id, term);

-- 输出 count 结果
data_result = FOREACH data_group GENERATE FLATTEN(group) AS (id, term) ,COUNT($1) as pv;

-- 如果想要把id, term单独拿出来
data_result = FOREACH data_group GENERATE group.$0 AS id, group.$1 AS term ,COUNT($1) as pv;
-- 这里要注意一下,因为上一步完成之后,同一个key下多条记录会放在一起, 如下所示,所以需要用flatten,把它重新打散
({(10, smerter),(10, smerter),(10, smerter)})
({(10, graviditeten), (10, graviditeten)})
({(10, udemærket)})

参考资料:
https://stackoverflow.com/questions/25012396/counting-elements-for-each-group-using-pig

发布了114 篇原创文章 · 获赞 55 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/96443689
今日推荐