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

Google cloud platform 如何根据数百条规则合并apache beam/dataflow中的相关记录?,google-cloud-platform,google-cloud-dataflow,apache-beam,dataflow,Google Cloud Platform,Google Cloud Dataflow,Apache Beam,Dataflow,我有我必须在记录级别加入的数据。例如,有关用户的数据来自不同的源系统,但没有公共主键或用户标识符 示例数据 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

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

示例数据

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相同
  • 有些规则可以推断记录值,并向主记录中添加有关客户的数据
  • 由于某些规则可能会推断/向任何特定记录添加数据,因此当记录发生更改时,必须重新应用这些规则
  • 我们每天有数百万条记录我们必须统一
apachebeam/Dataflow实现

  • Apache beam DAG从定义上讲是非循环的,但我可以通过pubsub将数据重新发布到同一个DAG,使其成为循环算法
  • 我可以创建一个hashmaps的PCollection,它可以连续地对所有其他元素进行自连接,但这似乎是一个低效的方法
  • 如果我想在PCollection通过规则时不断修改它,那么PCollection的不变性就是一个问题。这听起来像是使用
    Flink Gelly
    Spark GraphX
您知道在数据流中有什么方法可以有效地处理这样的问题吗

其他想法

  • Prolog:我试着用一部分规则在这个数据子集上运行,但swi Prolog似乎不可伸缩,我也不知道如何将结果持续发送到其他进程
  • JDrools/Jess/Rete:前向链接非常适合于推理和高效的局部应用,但该算法更多地是将许多规则应用于单个记录,而不是从可能相关的记录中推断记录信息
  • 图形数据库:类似于
    neo4j
    datomic
    的东西会很好,因为连接是在记录级别,而不是行/列扫描,但我不知道在beam中是否可以做类似的事情
  • BigQuery或扳手:在SQL中强制执行这些规则,并对每条记录执行完整的表扫描,速度非常慢。最好将所有记录的图形保存在内存中,并在内存中进行计算。我们还可以尝试对所有列进行合并,并在所有列中运行多个比较和更新

或者,也许有一种更标准的方法来解决这类问题。

根据我目前所读的资料,很难说哪种解决方案最适合你。我会尝试将问题进一步分开,并尝试分别处理不同方面的问题

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

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

  • 阅读记录
  • 尝试查找现有的匹配记录
  • 如果找到匹配的记录:
    • 用新数据更新
  • 否则保存记录以备将来匹配
  • 重复
对我来说,这看起来很高层次,在这个细节层次上可能没有单一的“正确”解决方案

我可能会先更详细地理解它(也许你已经了解了),然后再考虑一下:

  • 数据的属性是什么?
    • 有模式吗?例如,当一个系统发布某些内容时,您是否希望其他系统发布其他内容
  • 一般要求是什么?
    • 延迟、一致性、可用性等
  • 如何从源中读取数据?
    • 所有系统能否以文件的形式批量发布记录,将其提交到PubSub,您的解决方案是否需要轮询记录,等等
    • 数据可以并行读取还是单个流
  • 那么,在不同的假设和要求下,如何有效地匹配记录这一主要问题可能也会有所不同。例如,我会想到:
    • 你能把所有数据存储在内存中吗
    • 你的规则是动态的。他们到底有没有改变,当他们改变时会发生什么
    • 您是否可以将数据划分为可以单独存储和高效匹配的类别,例如,如果您知道您可以尝试通过id字段匹配某些内容,通过散列内容匹配其他一些内容,等等
    • 您是否需要匹配所有历史/现有数据
    • 你能有一些快速排除逻辑来避免昂贵的检查吗
  • 解决方案的输出是什么?输出的要求是什么

根据我目前所读的资料,很难说哪种解决方案最适合您。我会尝试将问题进一步分开,并尝试分别处理不同方面的问题

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

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

  • 阅读记录
  • 尝试查找现有的匹配记录
  • 如果找到匹配的记录:
    • 用新数据更新
  • 否则保存记录以备将来匹配
  • 重复
对我来说,这看起来是非常高的水平,可能没有单一的“正确”的解决方案