【问题标题】:Counting elements for each group using Pig使用 Pig 计算每个组的元素
【发布时间】:2014-09-20 15:40:27
【问题描述】:

我正在尝试对 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;
}

我得到的错误:

ERROR 1200:语法错误,'$1 处或附近出现意外符号

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

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    我认为您要做的只是按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);
    

    我希望我能很好地理解你想要什么!

    【讨论】:

    • 问题:为什么 COUNT($1) 与 COUNT(terms) 不同?例如,COUNT($1) 是否意味着“计算每个唯一对(cluster_id,terms)的实例数”?
    • 有人能帮我理解“FLATTEN(group)”中的小写“group”是如何使用的吗?我似乎找不到参考。所有结果都指向 GROUP .. BY :(
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2017-02-22
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多