Google cloud dataflow 在数据流中使用复杂对象

Google cloud dataflow 在数据流中使用复杂对象,google-cloud-dataflow,Google Cloud Dataflow,我们有几个通过数据流读取的BigQuery表。目前,这些表格被展平,大量数据被重复。在数据流中,所有操作都必须是幂等的,因此任何输出都只取决于函数的输入,其他任何地方都不保留状态。这就是为什么首先将所有属于一起的记录分组是有意义的,在我们的例子中,这可能意味着创建复杂的对象 复杂对象的示例(还有许多其他类似的类型)。显然,每种类型都有数百万个实例: Customer{ customerId address { street zipcode regi

我们有几个通过数据流读取的BigQuery表。目前,这些表格被展平,大量数据被重复。在数据流中,所有操作都必须是幂等的,因此任何输出都只取决于函数的输入,其他任何地方都不保留状态。这就是为什么首先将所有属于一起的记录分组是有意义的,在我们的例子中,这可能意味着创建复杂的对象

复杂对象的示例(还有许多其他类似的类型)。显然,每种类型都有数百万个实例:

Customer{
   customerId
   address {
      street
      zipcode
      region
      ... 
   }
   first_name
   last_name
   ...
   contactInfo: {
       "phone1": {type, number, ... },
       "phone2": {type, number, ... }
   }
}
我们发现的数据流示例只处理非常简单的对象,示例演示了计数、求和和平均

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

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

此时,我仍然想知道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

第一个操作应该是将这些行组合在一起构造一个实体,这样我们就可以使我们的操作幂等。在数据流中这样做的最佳方式是什么,或者给我们举一个这样做的例子?

您可以使用任何对象作为数据流管道中的元素。使用复杂对象(尽管它没有集合)

在您的示例中,您将对元素进行分组。结果是
KV
。这里的
KV
只是一个对象,里面有一个类似集合的值。然后你可以把它变成你想要的任何类型的对象

唯一需要注意的是,如果您只有很少几个真正大的元素,那么您可能会遇到一些并行性限制。具体来说,每个元素都需要足够小,以便在一台机器上进行处理


您可能还对
BigQueryIO
感兴趣。它只支持从查询(而不是表)读取数据,但它应该提供结果而不进行展平。

我们不使用windows,因此对于批处理作业,当我们应用groupbykey时,是否可以保证在全局数据集中的“Iterable”中有所有相关记录?只要您不使用windows或触发器,是--具有相同键的所有值都将出现在
Iterable
中。