代码之家  ›  专栏  ›  技术社区  ›  Tamas Eppel

使用Apache Beam在导入和全局数据库中查找重复项

  •  0
  • Tamas Eppel  · 技术社区  · 8 年前

    球门

    我的任务是在导入文件中找到重复的条目,并在稍后的阶段将这些导入文件的条目与全局数据库进行比较。文件中的数据是个人信息,如姓名、电子邮件、地址等。这些数据并不总是完整的,而且常常拼写错误。

    这些文件将由外部用户通过web表单上传。处理完成后,需要通知用户,用户必须能够下载结果。

    此外,为了解决此任务,我需要评估Apache Beam是否适合此任务。

    可能的解决方案

    我考虑了以下内容:导入文件将上载到S3,管道将以pub-sub事件(Kafka队列)的形式获取文件位置,或者监视S3(如果可能)以获取传入文件。

    然后通过一个PTransform读取文件,并将每一行推入一个PCollection。作为一个附带输出,我会更新一个搜索索引(在Redis或类似的系统中)。下一次转换将访问搜索索引,并尝试查找匹配项。最终结果(唯一值、重复值)将写入到S3的输出文件中,并为下次导入清除索引。

    问题

    • 这种方法有意义吗?它是Beam的惯用方法吗?
    • Beam是否适合此处理?
    • 以上有何改进建议?
    • 我需要跟踪文件名/ID,以便在最后通知用户。如何通过管道移动此元数据。我是否需要为元数据和负载创建一个“信封”对象,并在我的PCollection中使用该对象?
    • 传入文件是无边界的,但文件内容本身是有边界的。有没有办法以惯用的方式找出文件处理的结尾?
    1 回复  |  直到 8 年前
        1
  •  0
  •   Andrew Nguonly    8 年前

    这种方法有意义吗?它是Beam的惯用方法吗?

    这是一个主观问题。一般来说,我会说不,这不是Apache Beam的惯用用法。Apache Beam是定义ETL管道的框架。Beam编程模型没有用于重复数据消除的意见或内置功能。重复数据消除是通过实施(您编写的业务逻辑代码)或数据存储的功能(唯一约束,在SQL或键/值存储中选择DISTINCT)实现的。

    Beam是否适合此处理?

    是的,梁是合适的。

    以上有何改进建议?

    我不建议在管道中间写入搜索索引。通过这样做,然后尝试在下面的转换中读回数据,您已经在DAG中有效地创建了一个循环。管道可能会受到竞争条件的影响。有两条单独的管道就不那么复杂了——一条用于写入搜索索引(重复数据消除),另一条用于写回S3。

    我需要跟踪文件名/ID,以便在最后通知用户。如何通过管道移动此元数据。我是否需要为元数据和负载创建一个“信封”对象,并在我的PCollection中使用该对象?

    是的,这是一种方法。我相信您可以通过 ReadableFile

    传入文件是无边界的,但文件内容本身是有边界的。有没有办法以惯用的方式找出文件处理的结尾?

    我不太确定,但我认为这对于以流模式执行的管道来说是不可能的。