关于监听数据仓库表多个字段的状态来判断集市做插入更新删除的一种方法
ETL 数据仓库 数据集市
刚刚接触etl,对其中的很多东西都不了解。
在做到对数据仓库的监听这一操作时,遇到了一个比较繁琐的问题:集市表的操作原本是用存储过程实现的,现在要求通过Java代码实现。在仓库的某个表中存在四个状态字段,必须四个状态均符合特定的值,这条数据才算有效,此时将此表与其他表结合并插入集市表中;若有大于等于一个状态发生改变,这条数据不符合,将其从集市中删除,其他字段改变则集市执行更新操作。
代码
package com....;
import com....;
@Service
@Slf4j
@MonitorTableName("dw_risk_warning")
public class RangeDwRiskWarningService extends AbstractMonitorOperateService {
@Resource
private RiskUnmaintainedRangeDAO riskUnmaintainedRangeDAO;
@Override
public void update(MessageQueueDTO messageQueueDTO) {
//监听数仓的表数据发生变化时分发的新数据
List<DwRiskWarningDTO> dtos = parseArray(messageQueueDTO, new TypeReference<List<DwRiskWarningDTO>>() {});
//该条数据的原有值,注意,只有改变了的字段才会有数据
List<DwRiskWarningDTO> oldDtos = parseOldArray(messageQueueDTO, new TypeReference<List<DwRiskWarningDTO>>() {});
if (CollectionUtils.isNotEmpty(dtos)) {
for (int i = 0; i < dtos.size(); i++) {
DwRiskWarningDTO dwRiskWarningDTO = dtos.get(i); //获取新老dto的值
DwRiskWarningDTO oldDwRiskWarningDTO = oldDtos.get(i); //获取新老dto的值
int oldFlag = 0;
int newFlag = 0;
oldToNew(dwRiskWarningDTO, oldDwRiskWarningDTO); //对旧的数据进行赋值操作
if (oldDwRiskWarningDTO.getContractStatus() == 1 && oldDwRiskWarningDTO.getIsWhite() == 0 && oldDwRiskWarningDTO.getIsLow() == 1 && oldDwRiskWarningDTO.getBelowSettlement() == 0){ oldFlag = 1;} //数据符合标准则为 1,否则为0
if (dwRiskWarningDTO.getContractStatus() == 1 && dwRiskWarningDTO.getIsWhite() == 0 && dwRiskWarningDTO.getIsLow() == 1 && dwRiskWarningDTO.getBelowSettlement() == 0){ newFlag = 1;} //数据符合标准则为 1,否则为0
operationType(dwRiskWarningDTO, oldFlag, newFlag); //对数据进行判断从而得出操作方式
}
}
}
private void operationType(DwRiskWarningDTO dwRiskWarningDTO, int oldFlag, int newFlag) {
if (newFlag==1 && oldFlag==0){
List<DWVipcosPriceCollectionRelationshipsDTO> dwVipcosPriceCollectionRelationshipsDTOS = riskUnmaintainedRangeDAO.selectCollectionRelationshipsByContractNo(dwRiskWarningDTO.getContractNo());
if (!dwVipcosPriceCollectionRelationshipsDTOS.isEmpty()){
insert(dwRiskWarningDTO, dwVipcosPriceCollectionRelationshipsDTOS);
}
}else if (oldFlag==1 && newFlag==0){
List<RiskUnmaintainedRangeEntity> entities = riskUnmaintainedRangeDAO.selectUnmaintainedRangeEntityByContractNo(dwRiskWarningDTO.getContractNo());
delete(entities);
}else if (newFlag==1 && oldFlag==1){
update(dwRiskWarningDTO);
}
}
private void oldToNew(DwRiskWarningDTO dwRiskWarningDTO, DwRiskWarningDTO oldDwRiskWarningDTO) {
if (oldDwRiskWarningDTO.getContractStatus() == null){oldDwRiskWarningDTO.setContractStatus(dwRiskWarningDTO.getContractStatus());}
if (oldDwRiskWarningDTO.getIsWhite() == null){oldDwRiskWarningDTO.setIsWhite(dwRiskWarningDTO.getIsWhite());}
if (oldDwRiskWarningDTO.getIsLow() == null){oldDwRiskWarningDTO.setIsLow(dwRiskWarningDTO.getIsLow());}
if (oldDwRiskWarningDTO.getBelowSettlement() == null){oldDwRiskWarningDTO.setBelowSettlement(dwRiskWarningDTO.getBelowSettlement());}
}
private void update(DwRiskWarningDTO dwRiskWarningDTO) {}
private void delete(List<RiskUnmaintainedRangeEntity> entities) {}
private void insert(DwRiskWarningDTO dwRiskWarningDTO, List<DWVipcosPriceCollectionRelationshipsDTO> dwVipcosPriceCollectionRelationshipsDTOS) {}
}
解析
在 oldToNew 方法中,对接收到的新数据 dwRiskWarningDTO 以及发生改变的数据的历史状态 oldDwRiskWarningDTO 进行判断,若 oldDwRiskWarningDTO 中状态字段为空则将其赋值为 dwRiskWarningDTO 中的对应字段。此时,若oldDwRiskWarningDTO中的数据均符合标准,则设置 oldFlag = 1,否则为0;同理若 dwRiskWarningDTO 的状态数据均符合则设置 newFlag = 1,否则为0。此时共有如下几种情况:
- newFlag== 1 &&oldFlag== 0:说明这条数据的状态字段原本不符合而现在符合,此时将这条记录插入集市表。
- newFlag== 1 &&oldFlag== 1:说明这条数据的状态字段原本符合现在也符合,即状态字段未发生改变,改变的是其他字段,此时根据需要,若需要这些字段则更新进去即可。
- newFlag== 0 &&oldFlag== 1:原来的符合现在的不符合,说明数据更新后已经不符合标准,此时应将这条记录从集市表中删除。
- newFlag== 0 &&oldFlag== 0:从不符合变为不符合,忽略。