将嵌套元组取消嵌套为单个项

neskvpey  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(375)

我写了一个自定义项( 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;
jm81lzqq

jm81lzqq1#

我认为你的自定义项是回报不是你的工作流程的最佳选择。与返回具有可变字段数(即元组)的元组不同,返回一包元组会更方便。
而不是

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

你会有的

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

你就能把袋子压平到:1。使区别2。对标签进行排序
为此,请按以下方式更新您的自定义项:

class MyUDF extends EvalFunc <DataBag> {

    @Override
    public DataBag exec(Tuple input) throws IOException {
        // create DataBag
    }
}

相关问题