【问题标题】:Spring boot batch - best method to filter large dataSpring Boot 批处理 - 过滤大数据的最佳方法
【发布时间】:2021-04-07 16:25:41
【问题描述】:

我正在编写一个 Spring Boot 批处理应用程序,但我对处理大数据的最佳方式感到困惑。我有数百万个用户 ID 的输入文件,我需要从另一个表中删除这些 ID。我不认为查询每个用户 ID 是一个好主意,但我目前没有不同的解决方案。不幸的是,这些用户 ID 非常随机,无法排序。任何人都可以建议我最好的方法吗?数据库是 Oracle。

【问题讨论】:

  • 将文件分割成特定的大小。根据文件大小或类型或您的自定义逻辑创建从业者。 Spring 批处理本地分区线程池根据您的服务器电源配置并配置块。我们有几个工作在几个小时内处理春季批处理中的数百万个数据,数据库是 oracle。让我知道需要任何代码 sn-p
  • 感谢您的回复,我非常感谢。我想了解更多关于这方面的信息。您的意思是运行并行作业吗?主输入文件只有用户 ID,我想查询另一个数据库以删除不在我的初始输入文件中的任何 ID。你怎么查询?输入文件可能包含超过 4 亿个 id,我需要从第二个数据库中过滤掉所有其他 id,以便稍后删除。
  • 直观地说,一般最好的方法是不使用 Spring 批处理。而是加载数据库中的数据并使用not exists 查询来过滤重复的IDs。您甚至可以使用外部表一步完成。所以如果你因为一些政策而坚持使用Spring,尽量减少影响,让数据库来做艰苦的工作。祝你好运!
  • 感谢您的评论。数据存在于数据库中,我所要做的就是删除那些不在输入文件中的 id。它是一个净化过程。我不能在数据库上做太多事情,我所能做的就是想办法从外部以编程方式完成它。
  • @Thomson 我也喜欢使用“不存在”,因为该数据已经在数据库中可用并且操作已经在数据库服务器中。即使 oracle 如此强大,删除也始终是一项开销操作。如果您的企业仍然不允许对 DB 进行直接操作,我们可以考虑替代方案。

标签: spring oracle spring-boot spring-batch


【解决方案1】:

您可以将文件加载到临时表中,然后删除不在其中的 ID,例如:

DELETE FROM ORIGINAL_TABLE WHERE ID NOT IN (SELECT ID FROM TEMPORARY_TABLE).

这比对文件中的每个 ID 进行查询以检查其存在并在必要时将其删除要好。

如果你真的需要为此使用 Spring Batch,你可以为此创建一个两步作业:第一步是面向块并将文件加载到临时表中,第二步是执行的简单 tasklet删除查询。我会添加第三步来删除临时表并清理东西。

【讨论】:

    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多