使用Pig计算每个组的元素

时间:2014-07-29 09:44:40

标签: apache-pig

我试图在PigLatin中对每组的术语频率进行分组和计算,但是我有一些麻烦要弄清楚如何去做。

我有一组具有以下架构的对象:

{cluster_id: bytearray,terms: chararray}

以下是一些样本

(10, smerter)
(10, graviditeten)
(10, smerter)
(10, smerter)
(10, udemærket)    
(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, udemærket, 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)

最好的方法是什么? 以下代码按ID分组并计算条款,但我想计算每个组的条款。

by_clusters = GROUP sample_data by cluster_id;
by_clusters_terms_count = FOREACH by_clusters GENERATE group as cluster_id, COUNT($1);

我像这样进行分组,最后得到一个具有以下模式的对象

by_clusters: {group: bytearray,sample_data: {(cluster_id: bytearray,terms: chararray)}}

现在,我明确了实际计算' sample_data'中的条款。元组。 我正在考虑嵌套的foreach,但我仍然没有得到它如何在这种情况下应用它。 代码如下所示:

result = FOREACH by_clusters {

--count terms here, I don't know how

-- compiler gives me an error here
c = GROUP $1 BY terms; -- 
d = FOREACH c GENERATE COUNT(b), group;

GENERATE cluster_id, d;
}

我得到错误:

  

错误1200:语法错误,意外符号位于或附近' $ 1

最后,我想我已经结束了,但我无法解决它。 在这种情况下,我不相信我必须写一个UDF。

1 个答案:

答案 0 :(得分:11)

我认为您想要做的只是按cluster_idterms进行分组。

您第一次尝试时非常接近结果,只需将terms添加到您的论坛:

by_clusters = GROUP sample_data by (cluster_id, terms);
by_clusters_terms_count = FOREACH by_clusters GENERATE FLATTEN(group) as (cluster_id, terms), COUNT($1);

我希望我能理解你想要的东西!