首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从20个相关表(通过id)获取数据,将它们组合到一个json文件中,并利用spring批处理

从20个相关表(通过id)获取数据,将它们组合到一个json文件中,并利用spring批处理
EN

Stack Overflow用户
提问于 2015-09-22 15:43:13
回答 3查看 400关注 0票数 0

我在Server中有一个Person数据库,其中有大约20个表,如地址、许可证、亲属等。所有表都有每个人唯一的id参数。在这些表格中有数百万条记录。我需要结合使用普通id参数的人员的这些记录,并将其转换为具有某些列名更改的json表文件。这个json文件然后通过一个制片人被推送给卡夫卡。如果我能以kafka生产者作为项目编写者的例子--很好,但真正的问题是理解如何使用spring批处理项目阅读器、处理器和项目编写器来创建复合json文件的策略和细节。这是我的第一个Spring批处理应用程序,所以我对此还比较陌生。

我希望得到关于实现策略的建议,使用复合读取器或处理器使用person id作为游标,并使用每个表的id查询每个表,将生成的记录转换为json,并将其聚合为一个具有根表PersonData的复合关系json文件,该文件提供给kafka集群。

基本上,我有一个数据源,为读者提供相同的数据库。我计划使用person表来获取对Person唯一的id和其他记录,并使用id作为其他19个表的where子句。将每个结果集从表转换为json,并在末尾组合json对象并写入kafka。

EN

回答 3

Stack Overflow用户

发布于 2015-09-23 05:22:13

我们在一个项目中有这样一个需求,并通过下面的方法来解决它。

  1. 在并行运行的Splitflow中,我们有一个步骤用于永远加载文件中表的数据,并按普通id排序(这是可选的,但如果您有文件中的数据,测试就更容易了)。
  2. 然后我们实现了我们自己的"MergeReader“。这个mergereader对每个文件/表都有FlatFileItemReaders (让我们称它们为dataReaders)。所有这些FlatFileItemReaders都是用SingleItemPeekableItemReader包装的。MergeReader的读取方法的逻辑如下: public MyContainerPerId read() { //您需要一个容器来存储这些项,这些项属于MyContainerPerId容器=新的MyContainerPerId();//查看所有"dataReaders“以找到最小的实际键int lowestId = searchLowestKey();对于(Reader dataReader : dataReaders) { // i,一个表中的多个条目可以属于//同一个人id wihile (dataReader.peek().getId() == lowestId) { container.add(dataReader.read());}/容器包含来自所有表//属于同一个人id返回容器的所有条目;}

如果您需要重新启动功能,您可以在某种程度上实现ItemStream,使其能够跟踪每个dataReader的当前可读性。

票数 0
EN

Stack Overflow用户

发布于 2015-10-08 15:56:31

我使用了基于驱动查询的ItemReaders使用模式描述这里来解决这个问题。

读取器:使用sql来获取JdbcCursoritemReader的默认实现

代码语言:javascript
复制
     the unique relational id (e.g. select id from person -)

处理器:使用这个长id作为输入和一个由我实现的dao,使用jdbcTemplate from spring获取数据,通过对特定id的每个表进行查询(例如选择*在其中使用id=),并将列表格式映射为Person的POJO,然后转换为json对象(使用杰克逊),然后转换为string。

作者:要么用json字符串写出文件,要么在kafka使用时将json字符串发布到主题中。

票数 0
EN

Stack Overflow用户

发布于 2019-03-08 13:29:16

我们进行了类似的练习,将100 as +行从多个表迁移为JSON的一种形式,这样我们就可以将其发布到消息总线上。

这样做的目的是创建一个视图,将数据去规范化,并使用JdbcPagingItemReader.Reading从一个源读取该视图,这样就减少了开销。

当您对数据进行非规范化时,请确保不会为主表获取多行。

示例- SQL server -

代码语言:javascript
复制
create or alter view viewName as
select master.col1 , master.col2,
(select dep1.col1,
               dep1.col2
               from dependent1 dep1
        where dep1.col3 = master.col3 for json path
       )                as dep1
from master master;

以上将为您提供json字符串中的依赖表数据,每个主表数据有一行。一旦检索到数据,就可以使用GSON或Jackson将其转换为POJO。

我们试图避免使用JdbcCursoritemReader,因为它会提取内存中的所有数据,并逐个从其中读取数据。它不支持分页。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32721228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档