Pig UDF - 将动态模式作为一组字段(不是元组)返回

Posted

技术标签:

【中文标题】Pig UDF - 将动态模式作为一组字段(不是元组)返回【英文标题】:Pig UDF - Return dynamic schema as a set of fields (not tuple) 【发布时间】:2015-08-18 06:19:01 【问题描述】:

在 GROUP BY + FLATTEN 之后,我有一个带有命名空间的数据:

DESCRIBE users;
users: user_id: int, group_id: int, registration_timestamp: int

users_with_namespace = FOREACH (GROUP users BY group_id) 
    first_to_latest = ORDER users BY registration_timestamp ASC;
    first_user = LIMIT first_to_latest 1;
    GENERATE FLATTEN(first_user);
;

DESCRIBE users_with_namespace;
users_with_namespace: first_user::user_id: int, first_user::group_id: int, first_user::registration_timestamp: int

我希望能够做类似的事情:

users = myudf.strip_namespace(users_with_namespace);

或者(因为这似乎不可能):

users = FOREACH (GROUP users_with_namespaceALL) 
GENERATE myudf.strip_namespace(users_with_namespace);

结果是:

> DESCRIBE users;
users: user_id: int, registration_timestamp: int

我编写了一个 Jython Pig UDF,它应该删除任何命名空间的字段名称,但我似乎无法从我的 UDF 返回一组字段。只有 Bag/Tuple/Single 字段是可能的,这给我留下了这样的结果:

DESCRIBE users;
users: t: (user_id: int, registration_timestamp: int)

有什么方法可以省略 't' 并返回一个列表/字段集?我的 UDF 如下所示:

@outputSchemaFunction("tupleSchema")
def strip_namespace(input):
    return input


@schemaFunction("tupleSchema")
def tupleSchema(input):
    fields = []
    dt = []
    for i in input.getField(0).schema.getFields():
        for field in i.schema.getFields():
            fields.append(field.alias.split("::")[-1])
            dt.append(field.type)
    return SchemaUtil.newTupleSchema(fields, dt)

到目前为止我用过

FOREACH .. GENERATE namespace::field as field, ...

去除命名空间,但这种方法对于具有许多字段的数据集来说确实很乏味。

【问题讨论】:

【参考方案1】:

很遗憾,您不能,至少现在不能。问题正是你所说的:现在你只能返回一个元组、一个包或一个字段。 2 个月前,我创建了一个 JIRA issue 以允许为这种情况返回多个字段,但还没有回复......

我真的希望他们将来实现这一点,因为当您必须执行许多连接时,您最终会得到比实际代码更多的 FOREACH 语句来重命名字段。

【讨论】:

以上是关于Pig UDF - 将动态模式作为一组字段(不是元组)返回的主要内容,如果未能解决你的问题,请参考以下文章

多个元组作为用 Java 编写的 pig UDF 中的输入

产生与输入具有相同模式的输出的 Pig UDF

Pig UDF 似乎总是在单个减速器中运行 - PARALLEL 不起作用

Unix Shell 脚本作为 Pig 和 Hive 的 UDF

使用 AliasableEvalFunc 并在 Java UDF 中读取一组元组

如何将输入模式附加到猪的输出