如何创建一个在猪身上嵌套袋子的outputschema

时间:2015-06-09 04:04:17

标签: hadoop apache-pig udf

我正在尝试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)
     }
   )
  }
}

目标是将订单级别和产品级别的数据保存在两个独立的猪输出表中。

有更好的方法吗?

1 个答案:

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

    [...]

 }