flume修改sqlsource以针对时间戳增量数据传输

flume修改sqlsource以针对时间戳增量数据传输

flume github关于增量数据传输的原理,是通过唯一id,递增,每次记录传输的数据量+current_index=last_index,不符合我们此次项目没有增量id的情况。
由于数据存在时间戳标志,因此改写flume sqlsource以应对实际需求:

  1. 每次增量传输先查询数据库中当前最大的时间戳,记录为maxtime
  2. 查询数据库:select * from table where time>=current_index and time<maxtime,此时不能取到time=maxtime的数据,不排除在数据查询之后会继续生成maxtime的新数据,则会出现数据遗漏
  3. 增量数据操作完成,将current_index=maxtime,写入状态表

SQLSourceHelper增加以下两段代码:

//增加取数据库最大值的代码
public String maxQuery() {
    return "SELECT max(" + time + ") FROM " + table;
  }

//增量查询oracle语句
  public String buildQuery(String maxTime) {

    if (customQuery == null) {
      return "SELECT " + columnsToSelect + " FROM " + table + " " +
             "WHERE "+ time + ">=to_date('" + currentIndex + "','yyyy-mm-dd hh24:mi:ss') AND " + time + "<to_date('" + maxTime + "','yyyy-mm-dd hh24:mi:ss') " +
              "order by "+time+" asc";
    } else {
      if (customQuery.contains("$@$")) {
        return customQuery.replace("$@$", currentIndex) ;
      } else {
        return customQuery ;
      }
    }
  }

HibernateHelper修改executeQuery方法:

public List<List<Object>> executeQuery() throws InterruptedException, ParseException {
		
		List<List<Object>> rowsList = new ArrayList<List<Object>>() ;
		Query query;
		if (!session.isConnected()){
			resetConnection();
		}
				

		String sql = sqlSourceHelper.maxQuery();
		LOG.info("sql "+sql);
		List<List<Object>> max = session.createSQLQuery(sql).setResultTransformer(Transformers.TO_LIST).list();
		String maxtime = max.get(0).get(0).toString().substring(0,19);
		query = session.createSQLQuery(sqlSourceHelper.buildQuery(maxtime));		
		try {
			rowsList = query.setResultTransformer(Transformers.TO_LIST).list();
			LOG.info("Current time is "+sqlSourceHelper.getCurrentIndex()+",and lasttime is "+maxtime);
			LOG.info("Records count: "+rowsList.size());
		}catch (Exception e){
			LOG.error("Exception thrown, resetting connection.",e);
			resetConnection();
		}
		sqlSourceHelper.setCurrentIndex(maxtime);
		return rowsList;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值