使用pig计算每组的元素

dsf9zpds  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(341)

我试着用piglatin对每一组词的频率进行分组和统计,但我在想办法解决这个问题时遇到了一些困难。
我有一个具有以下架构的对象集合:

  1. {cluster_id: bytearray,terms: chararray}

这是一些样品

  1. (10, smerter)
  2. (10, graviditeten)
  3. (10, smerter)
  4. (10, smerter)
  5. (10, udemærket)
  6. (20, eis feuer)
  7. (20, herunterladen schau)
  8. (20, download gratis)
  9. (20, download gratis)
  10. (30, anschauen kinofilm)
  11. (30, kauf rechnung)
  12. (30, kauf rechnung)
  13. (30, versandkostenfreie lieferung)
  14. (30, kostenlose)
  15. (30, kostenlose)
  16. (30, kostenlose)

我想得到的结果是这样的

  1. (10, smerter, 3)
  2. (10, graviditeten, 2)
  3. (10, udemærket, 1)
  4. (20, download gratis, 2)
  5. (20, eis feuer, 1)
  6. (20, herunterladen schau, 1)
  7. (30, kostenlose, 3)
  8. (30, kauf rechnung, 2)
  9. (30, anschauen kinofilm, 1)
  10. (30, versandkostenfreie lieferung, 1)

最好的办法是什么?下面的代码按id分组并计算术语,但我想计算每个组的术语。

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

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

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

现在,我开始计算“sample\u data”元组中的术语。我正在考虑嵌套foreach,但我仍然不知道如何将其应用到本例中。代码如下所示:

  1. result = FOREACH by_clusters {
  2. --count terms here, I don't know how
  3. -- compiler gives me an error here
  4. c = GROUP $1 BY terms; --
  5. d = FOREACH c GENERATE COUNT(b), group;
  6. GENERATE cluster_id, d;
  7. }

我得到的错误:
错误1200:语法错误,'$1处或附近出现意外符号
最后,我想我接近了,但我无法解决它。我不相信在这种情况下我会写一个自定义项。

rnmwe5a2

rnmwe5a21#

我认为你想做的只是分组 cluster_id 以及 terms .
你第一次尝试的结果非常接近,只要加上 terms 致您的团队:

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

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

相关问题