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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值