【问题标题】:Using complex objects in DataFlow在 DataFlow 中使用复杂对象
【发布时间】:2016-05-11 00:13:25
【问题描述】:

我们有几个通过 DataFlow 读取的 BigQuery 表。目前,这些表被展平,并且大量数据重复。在 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 中执行此操作的最佳方法是什么,或者为我们提供一个示例?

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

    您可以将任何对象用作数据流管道中的元素。 TrafficMaxLaneFlow example 使用了一个复杂的对象(虽然它没有集合)。

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

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

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

    【讨论】:

    • 我们没有使用windows,所以对于批处理作业,当我们应用groupbykey时,我们是否保证在全局数据集的“Iterable”中有所有相关记录可用?跨度>
    • 只要您不使用 Windows 或触发器,是的 - 所有具有相同键的值都将出现在 Iterable<V> 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多