我正在尝试Pig UDF并一直在阅读它。虽然在线内容很有帮助,但我仍然不确定我是否了解如何创建具有嵌套包的复杂输出模式。
请帮助。要求如下。比如说,我正在分析电子商务订单数据。订单可以在其中订购多个产品。
我将产品级别数据分组到订单级别。这是我的UDF的输入。因此,包含每个订单中产品信息的订单级别的每个分组数据都是我的输入。
InputSchema:
(grouped_at_order, {
(input_column_values_at_product1_level),
(input_column_values_at_product2_level)
})
我将在订单级别和UDF的产品级别计算指标。例如:sum(产品)是订单级别指标,每个产品的颜色是产品级别指标。因此,ForEach行在发送到UDF的订单级别分组,我想计算订单级别&项目级别指标。
预期的OutputSchema:
{
{ (orders, (computed_values_at_order_level)) },
{(productlevel,
{
(computed_values_at_product1_level),
(computed_values_at_product2_level),
(computed_values_at_product3_level)
}
)
}
}
目标是将订单级别和产品级别的数据保存在两个独立的猪输出表中。
有更好的方法吗?
答案 0 :(得分:1)
正如@maxymoo所说,在从UDF返回嵌套数据之前,我会首先检查是否真的需要它。
无论如何,如果你这样做,解决方案并不复杂,但却很痛苦。您只需创建模式,添加字段,然后为元组创建模式,将字段或子包添加到其中,依此类推。
@Override
public Schema outputSchema(Schema input) {
Schema statsOrderLevel = new Schema();
statsOrderLevel.add(new FieldSchema("value", DataType.CHARARRAY));
Schema statsOrderLevelTuple = new Schema();
statsOrderLevelTuple.add(new FieldSchema(null, statsOrderLevel, DataType.TUPLE);
Schema statsOrderLevelBag = new Schema();
statsOrderLevelBag.add(new FieldSchema("stats", statsOrderLevelTuple, DataType.BAG));
[...]
}