0

我写了一个 udf ( extends EvalFunc<Tuple>),它有作为输出的元组和内部元组(嵌套)。

例如转储看起来像:

(((photo,photos,photo)))
(((wedg,wedge),(audusd,audusd)))
(((quantum,quantum),(mind,mind)))
(((cassi,cassie),(cancion,canciones)))
(((calda,caldas),(nova,novas),(rodada,rodada)))
(((fingerprint,fingerprint),(craft,craft),(easter,easter)))

现在我想处理每个术语,区分它并给它一个 id ( RANK)。为此,我需要去掉括号。在这种情况下,简单FLATTEN的没有帮助。

最终输出应该是这样的:

1 photo
2 photos
3 wedg
4 wedge
5 audusd
6 quantum
7 mind
....

我的代码(不是 udf 部分,也不是原始解析):

tags = FOREACH raw GENERATE FLATTEN(tags) AS tag;
tags_distinct = DISTINCT tags;
tags_sorted = RANK tags_distinct BY tag;
DUMP tags_sorted;
4

1 回答 1

1

我认为您的 UDF 返回对于您的工作流程来说并不是最佳的。与其返回具有可变数量字段(元组)的元组,不如返回一袋元组更方便。

代替

(((wedg,wedge),(audusd,audusd)))

你将会有

({(wedg,wedge),(audusd,audusd)})

并且您将能够将那个包压平: 1. 制作 DISTINCT 2. 排列标签

为此,请像这样更新您的 UDF:

class MyUDF extends EvalFunc <DataBag> {

    @Override
    public DataBag exec(Tuple input) throws IOException {
        // create DataBag
    }
}
于 2015-06-07T17:59:04.087 回答