0

我正在尝试 Pig UDF 并且一直在阅读它。虽然在线内容很有帮助,但我仍然不确定我是否了解如何创建具有嵌套包的复杂输出模式。

请帮忙。要求如下。例如,我正在分析电子商务订单数据。一个订单中可以订购多个产品。

我有按订单级别分组的产品级别数据。这是我的 UDF 的输入。因此,包含每个订单中产品信息的订单级别的每个分组数据都是我的输入。

输入架构:

(grouped_at_order, {
    (input_column_values_at_product1_level),
    (input_column_values_at_product2_level)
})

我将在 UDF 中计算订单级别和产品级别的指标。例如: sum(products) 是一个订单级别的度量,每个产品的颜色是一个产品级别的度量。因此,在发送到 UDF 的订单级别分组的 ForEach 行,我想计算订单级别和项目级别的指标。

预期的输出架构:

{
 { (orders, (computed_values_at_order_level)) }, 
  {(productlevel, 
     {
      (computed_values_at_product1_level),
      (computed_values_at_product2_level),
      (computed_values_at_product3_level)
     }
   )
  }
}

然后,目标是将订单级别和产品级别的数据保存在来自 pig 的两个单独的输出表中。

有没有更好的方法来做同样的事情?

4

1 回答 1

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));

    [...]

 }
于 2015-06-09T06:57:48.027 回答