我将如何根据数百条规则合并 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...}
- 我可以使用大约 100 条规则将一条记录与另一条记录进行比较
查看源系统 1 中的客户是否与源系统 2 相同。
- 某些规则可能能够推断记录值并将数据添加到有关客户的主记录中。
- 因为某些规则可能 infer/add 数据到任何特定记录,所以当记录更改时必须再次重新应用规则。
- 我们每天有数百万条记录需要统一
Apache Beam/数据流实施
- Apache Beam DAG 根据定义是非循环的,但我可以通过 pubsub 将数据重新发布到同一个 DAG 以使其成为循环算法。
- 我可以创建一个散列图的 PCollection,它不断地对所有其他元素进行自连接,但这似乎是一种低效的方法
- 如果我想根据规则不断修改事物,那么 PCollection 的不变性就是一个问题。这听起来像
Flink Gelly
或 Spark GraphX
会更有效率
您是否知道数据流中有什么方法可以有效地处理此类问题?
其他想法
- Prolog:我尝试 运行ning 使用规则的子集处理此数据的子集,但 swi-prolog 似乎无法扩展,我无法弄清楚如何将结果持续发送给其他人进程。
- JDrools/Jess/Rete:前向链接对于推理和高效的部分应用来说是完美的,但是这个算法更多的是将许多规则应用于单个记录,而不是从可能相关的记录中推断记录信息。
- 图形数据库:像
neo4j
或 datomic
这样的东西会很好,因为连接是在记录级别而不是 row/column 扫描,但我不知道它是否可能在光束做类似的事情
- BigQuery 或 Spanner:在 SQL 中强制执行这些规则并对每条记录进行完整 table 扫描真的很慢。最好将所有记录的图形保存在内存中并在内存中计算。我们还可以尝试连接所有列并 运行 对所有列进行多重比较和更新
或者也许有更标准的方法来解决这些 class 问题。
目前为止,很难说哪种解决方案最适合您。我会尝试进一步拆分问题并尝试分别解决不同的方面。
据我了解,目标是将不同来源中代表同一事物的匹配记录组合在一起:
- 记录来自多个来源:
- 逻辑上是相同的数据,但格式不同;
- 有一些规则可以判断记录是否代表同一实体:
- 规则集合是静态的;
所以,逻辑大概是这样的:
- 读取一条记录;
- 尝试查找现有的匹配记录;
- 如果找到匹配的记录:
- 用新数据更新它;
- 否则保存记录以备日后匹配;
- 重复;
对我来说,这看起来非常高级,在这种详细程度下可能没有单一的 'correct' 解决方案。
我可能会尝试通过首先更详细地了解它来解决这个问题(也许你已经这样做了),一些想法:
- 数据的属性是什么?
- 有规律吗?例如。当一个系统发布一些东西时,您是否期望其他系统发布其他东西?
- 一般有什么要求?
- 延迟、一致性、可用性等;
- 如何从源中读取数据?
- 所有系统都可以将记录批量发布到文件中,提交到 PubSub,你的解决方案是否需要轮询它们等?
- 数据可以并行读取还是单流读取?
- 那么在不同的假设和要求下,您如何才能有效地匹配一般记录的主要问题可能看起来也会有所不同。例如我会考虑:
- 你能把所有的数据都放在内存中吗;
- 你的规则是动态的吗?他们有没有改变,当他们改变时会发生什么;
- 能否将数据拆分成可以单独存储并有效匹配的类别,例如如果你知道你可以尝试通过 id 字段匹配一些东西,通过某些东西的哈希匹配其他东西,等等;
- 您需要匹配所有 historical/existing 数据吗?
- 你能有一些快速消除逻辑来避免昂贵的检查吗?
- 解决方案的输出是什么?对输出有什么要求?
我有必须在记录级别加入的数据。例如,有关用户的数据来自不同的源系统,但没有共同的主键或用户标识符
示例数据
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...}
- 我可以使用大约 100 条规则将一条记录与另一条记录进行比较 查看源系统 1 中的客户是否与源系统 2 相同。
- 某些规则可能能够推断记录值并将数据添加到有关客户的主记录中。
- 因为某些规则可能 infer/add 数据到任何特定记录,所以当记录更改时必须再次重新应用规则。
- 我们每天有数百万条记录需要统一
Apache Beam/数据流实施
- Apache Beam DAG 根据定义是非循环的,但我可以通过 pubsub 将数据重新发布到同一个 DAG 以使其成为循环算法。
- 我可以创建一个散列图的 PCollection,它不断地对所有其他元素进行自连接,但这似乎是一种低效的方法
- 如果我想根据规则不断修改事物,那么 PCollection 的不变性就是一个问题。这听起来像
Flink Gelly
或Spark GraphX
会更有效率
您是否知道数据流中有什么方法可以有效地处理此类问题?
其他想法
- Prolog:我尝试 运行ning 使用规则的子集处理此数据的子集,但 swi-prolog 似乎无法扩展,我无法弄清楚如何将结果持续发送给其他人进程。
- JDrools/Jess/Rete:前向链接对于推理和高效的部分应用来说是完美的,但是这个算法更多的是将许多规则应用于单个记录,而不是从可能相关的记录中推断记录信息。
- 图形数据库:像
neo4j
或datomic
这样的东西会很好,因为连接是在记录级别而不是 row/column 扫描,但我不知道它是否可能在光束做类似的事情 - BigQuery 或 Spanner:在 SQL 中强制执行这些规则并对每条记录进行完整 table 扫描真的很慢。最好将所有记录的图形保存在内存中并在内存中计算。我们还可以尝试连接所有列并 运行 对所有列进行多重比较和更新
或者也许有更标准的方法来解决这些 class 问题。
目前为止,很难说哪种解决方案最适合您。我会尝试进一步拆分问题并尝试分别解决不同的方面。
据我了解,目标是将不同来源中代表同一事物的匹配记录组合在一起:
- 记录来自多个来源:
- 逻辑上是相同的数据,但格式不同;
- 有一些规则可以判断记录是否代表同一实体:
- 规则集合是静态的;
所以,逻辑大概是这样的:
- 读取一条记录;
- 尝试查找现有的匹配记录;
- 如果找到匹配的记录:
- 用新数据更新它;
- 否则保存记录以备日后匹配;
- 重复;
对我来说,这看起来非常高级,在这种详细程度下可能没有单一的 'correct' 解决方案。
我可能会尝试通过首先更详细地了解它来解决这个问题(也许你已经这样做了),一些想法:
- 数据的属性是什么?
- 有规律吗?例如。当一个系统发布一些东西时,您是否期望其他系统发布其他东西?
- 一般有什么要求?
- 延迟、一致性、可用性等;
- 如何从源中读取数据?
- 所有系统都可以将记录批量发布到文件中,提交到 PubSub,你的解决方案是否需要轮询它们等?
- 数据可以并行读取还是单流读取?
- 那么在不同的假设和要求下,您如何才能有效地匹配一般记录的主要问题可能看起来也会有所不同。例如我会考虑:
- 你能把所有的数据都放在内存中吗;
- 你的规则是动态的吗?他们有没有改变,当他们改变时会发生什么;
- 能否将数据拆分成可以单独存储并有效匹配的类别,例如如果你知道你可以尝试通过 id 字段匹配一些东西,通过某些东西的哈希匹配其他东西,等等;
- 您需要匹配所有 historical/existing 数据吗?
- 你能有一些快速消除逻辑来避免昂贵的检查吗?
- 解决方案的输出是什么?对输出有什么要求?