在DataFlow中使用复杂对象

时间:2016-05-10 06:37:02

标签: google-cloud-dataflow

我们有几个BigQuery表,我们通过DataFlow读取。目前这些表格已经扁平化,并且重复了大量数据。在Dataflow中,所有操作必须是幂等的,因此任何输出仅取决于函数的输入,其他任何地方都没有状态。这就是为什么首先将所有记录组合在一起是有意义的,在我们的例子中,这可能意味着创建复杂的对象。

复杂对象的示例(还有很多其他类型的对象)。我们可以明显地拥有数百万个每种类型的实例:

Customer{
   customerId
   address {
      street
      zipcode
      region
      ... 
   }
   first_name
   last_name
   ...
   contactInfo: {
       "phone1": {type, number, ... },
       "phone2": {type, number, ... }
   }
}

我们在DataFlow中找到的示例仅处理非常简单的对象,示例演示了计数,求和和平均。

在我们的案例中,我们最终希望使用DataFlow根据规则集执行更复杂的处理。这些规则适用于客户,发票或订单的完全联系,并最终生成一整套指标,金额和其他项目。

我们考虑在BigQuery中100%执行此操作,但由于每个实体适用的规则,这会很快变得非常混乱。

此时我仍然想知道DataFlow是否真的适合这项工作。几乎没有dataFlow的示例演示了它如何用于具有一个或两个集合的这些类型的更复杂对象。我发现最接近的是使用“LogMessage”对象进行日志处理,但是它没有任何集合,因此没有进行任何分层处理。

我们面临的最大问题是分层处理。我们正在阅读这样的数据:

customerid ... street zipcode region ... phoneid type number
 1               a       b       c        phone1  1    555-2424
 1               a       b       c        phone2  1    555-8181

第一个操作应该将这些行组合在一起构建一个单独的实体,这样我们就可以使我们的操作具有幂等性。在DataFlow中执行此操作的最佳方法是什么,或者指向一个可以做到这一点的示例?

1 个答案:

答案 0 :(得分:1)

您可以将任何对象用作Dataflow管道中的元素。 TrafficMaxLaneFlow example使用复杂对象(尽管它没有集合)。

在您的示例中,您将执行GroupByKey对元素进行分组。结果是KV<K, Iterable<V>>。这里的KV只是一个对象,里面有一个类似集合的值。然后,您可以将KV<K, Iterable<V>>转换为您想要的任何类型的对象。

唯一需要注意的是,如果你的元素非常少,那么你可能遇到一些并行性限制。具体来说,每个元素都需要足够小,以便在一台机器上进行处理。

您可能还对BigQueryIO上的withoutFlatteningResults感兴趣。它只支持从查询(而不是表格)中读取,但它应该提供结果而不会展平。