我将如何根据数百条规则合并 apache beam / dataflow 中的相关记录?

How would I merge related records in apache beam / dataflow, based on hundreds of rules?

我有必须在记录级别加入的数据。例如,有关用户的数据来自不同的源系统,但没有共同的主键或用户标识符

示例数据

Source System 1:
{userid = 123, first_name="John", last_name="Smith", many other columns...}

Source System 2:
{userid = EFCBA-09DA0, fname="J.", lname="Smith", many other columns...}

Apache Beam/数据流实施

您是否知道数据流中有什么方法可以有效地处理此类问题?

其他想法

或者也许有更标准的方法来解决这些 class 问题。

目前为止,很难说哪种解决方案最适合您。我会尝试进一步拆分问题并尝试分别解决不同的方面。

据我了解,目标是将不同来源中代表同一事物的匹配记录组合在一起:

  • 记录来自多个来源:
    • 逻辑上是相同的数据,但格式不同;
  • 有一些规则可以判断记录是否代表同一实体:
    • 规则集合是静态的;

所以,逻辑大概是这样的:

  • 读取一条记录;
  • 尝试查找现有的匹配记录;
  • 如果找到匹配的记录:
    • 用新数据更新它;
  • 否则保存记录以备日后匹配;
  • 重复;

对我来说,这看起来非常高级,在这种详细程度下可能没有单一的 'correct' 解决方案。

我可能会尝试通过首先更详细地了解它来解决这个问题(也许你已经这样做了),一些想法:

  • 数据的属性是什么?
    • 有规律吗?例如。当一个系统发布一些东西时,您是否期望其他系统发布其他东西?
  • 一般有什么要求?
    • 延迟、一致性、可用性等;
  • 如何从源中读取数据?
    • 所有系统都可以将记录批量发布到文件中,提交到 PubSub,你的解决方案是否需要轮询它们等?
    • 数据可以并行读取还是单流读取?
  • 那么在不同的假设和要求下,您如何才能有效地匹配一般记录的主要问题可能看起来也会有所不同。例如我会考虑:
    • 你能把所有的数据都放在内存中吗;
    • 你的规则是动态的吗?他们有没有改变,当他们改变时会发生什么;
    • 能否将数据拆分成可以单独存储并有效匹配的类别,例如如果你知道你可以尝试通过 id 字段匹配一些东西,通过某些东西的哈希匹配其他东西,等等;
    • 您需要匹配所有 historical/existing 数据吗?
    • 你能有一些快速消除逻辑来避免昂贵的检查吗?
  • 解决方案的输出是什么?对输出有什么要求?