簡體   English   中英

如何在Spring Batch中讀取多個CSV文件以合並數據進行處理?

[英]How to read multiple CSV files in Spring Batch to merge the data for processing?

我是Spring Batch的新手,正在嘗試獲取有關以下要求的指南。

總體要求:

我必須從不同的系統中獲取數據,應用一些業務邏輯,並將結果保存在DB中。

下面是一個例子。

我需要從3個CSV文件中讀取數據。 第一個文件– person.csv –包含名稱和ID。第二個文件– address.csv –包含每個人的地址信息。 一個人可以有零個或多個地址。
第三個文件– Employment.csv –包含每個人的就業信息。 一個人可以有零個或多個雇主。

這是一些示例。

Person.csv ###(總大小為800萬)

“ personID”,“ personName”

1,喬伊

2,錢德勒

3,羅斯

4,莫妮卡

地址.csv

“ personID”,“ addressType”,“ state”

紐約市1號住宅

1,郵寄,數控

紐約市2號住宅

紐約市4號住宅

4,郵寄,DC

職業.csv

“ personID”,“ employerName”

1,emp1

2,emp2

2,emp3

3,emp4

注意:每個文件均按人員ID排序。

要應用業務邏輯,我需要合並每個人的數據,即,我需要合並一個人的人,地址,就業數據以應用邏輯。 您能為此建議任何方法嗎?

這聽起來像一個4 ,工作。 您必須確定步驟1到3的中間結果應該在哪里。

如果所有CSV文件中的數據都可以存儲在內存中,則步驟1至3的中間結果可能只是一個Map ,並以personID作為鍵。 如果不是,則步驟1至3的中間結果可能應該寫入數據庫的臨時表中。

假設所有數據都可以容納在內存中,請創建一個可以注入到步驟1到步驟3的ItemWriters中的bean,例如:

// in a config class...
// assuming PersonID is of type Long
// Assuming Person class has appropriate attributes
Map<Long, Person> people = new HashMap<>();

第1步:

  • ItemReader-讀取下一個Person.CSV行並創建一個Person實例
  • ItemProcessor-無關緊要-將Person實例傳遞給ItemWriter
  • ItemWriter -增加Person實例到people地圖(或中間表)。

第2步:

  • ItemReader-讀取下一個Address.CSV行並創建一個Address實例
  • ItemProcessor-無關緊要-將Address實例傳遞給ItemWriter
  • ItemWriter-將地址從people映射(或中間表)添加到相關的人員。 待辦事項:如果不存在某人的地址,該怎么辦?

第三步:

  • ItemReader-讀取下一個Job.CSV行並創建一個Job實例
  • ItemProcessor-無關緊要-將Jobing實例傳遞給ItemWriter
  • ItemWriter-從people圖(或中間表)向相關人員添加就業。 待辦事項:如果某人不存在工作,該怎么辦?

由於第1到第3步中ItemProcessor不需要執行任何操作,因此最好使用Tasklet。

同樣,步驟1至3可以並行進行。 這可能會提高性能,但是會增加復雜性以確保people正確填充。

第四步:

  • ItemReader -讀取的下一個元素people (或從中間表復合對象)
  • ItemProcessor-應用業務邏輯
  • ItemWriter-將結果寫入數據庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM