Pig UDF - Return 动态模式作为一组字段(不是元组)
Pig UDF - Return dynamic schema as a set of fields (not tuple)
在 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 中 return 一组字段。只有 Bag/Tuple/Single 字段是可能的,这给我留下了这样的结果:
DESCRIBE users;
users: {t: (user_id: int, registration_timestamp: int)}
有没有办法省略't'和return一个list/set字段?我的 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)
到目前为止我用过[=18=]
FOREACH .. GENERATE namespace::field as field, ...
剥离命名空间,但这种方法对于字段很多的数据集来说真的很乏味。
不幸的是你不能,至少现在不能。问题正是你所说的:现在你只能 return 一个元组、一个包或一个字段。我在 2 个月前创建了一个 JIRA issue 以允许 return 这个场景的多个字段,但还没有回复......
我真的希望他们将来能实现这一点,因为当您必须执行许多联接时,您最终会使用比实际代码更多的 FOREACH
语句来重命名字段。
在 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 中 return 一组字段。只有 Bag/Tuple/Single 字段是可能的,这给我留下了这样的结果:
DESCRIBE users;
users: {t: (user_id: int, registration_timestamp: int)}
有没有办法省略't'和return一个list/set字段?我的 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)
到目前为止我用过[=18=]
FOREACH .. GENERATE namespace::field as field, ...
剥离命名空间,但这种方法对于字段很多的数据集来说真的很乏味。
不幸的是你不能,至少现在不能。问题正是你所说的:现在你只能 return 一个元组、一个包或一个字段。我在 2 个月前创建了一个 JIRA issue 以允许 return 这个场景的多个字段,但还没有回复......
我真的希望他们将来能实现这一点,因为当您必须执行许多联接时,您最终会使用比实际代码更多的 FOREACH
语句来重命名字段。