mysql:本表只保留一个月数据,将一个月之前的数据导入历史表,并采用azkaban进行定时调度

业务场景解析:
1.将本表中一个月前的数据导入历史表中;
2.将本表中一个月前的数据删除;
3.采用azkaban设定任务定时调度。
例:A表为原始表,包含所有的数据,B表为新建历史表,现在我们业务需求为A表只需保留一个月的数据查询,其他数据导入历史表做后期数据分析,利用azkaban进行定时调度,确保A表数据始终是近一个月的数据,历史数据同步到B表。

MySQL:

1.先创建一个存储过程,存储过程是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。
2.将SQL语句写入

CREATE PROCEDURE `B`()
BEGIN
INSERT ignore into B 
SELECT * from `A`  where  date_format(A.时间戳字段,'%Y-%m-%d') <= date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m-%d');
DELETE A
FROM A  WHERE date_format(A.时间戳字段,'%Y-%m-%d') <= date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m-%d');
END

date_format():将A表中的时间戳字段格式化,只取年月日,例:2020-11-11;
DATE_SUB():当前时间减去间隔时间,curdate获取当前时间, INTERVAL 1 MONTH 减去一个月,剩下的是一个月前的时间;
A.时间戳字段 <= 当前时间减一个月时间,即可取到一个月前所有数据。
注:delete后面一定要跟上操作的表名或别名,不然会报错。

azkaban配置:

azkaban在任务调度时需要将编写的文件打成一个Zip包上传,并配置调度时间。
在实际的业务场景中,配置了下.sql文件,.py文件,.job文件,.sql文件即上面编写的SQL存储过程,
.py文件如下:

import time
import datetime
import MySQLdb
def B()
    conn = MySQLdb.connect(
        host='selfhost',
        user='selfuser',
        passwd='selfpassword',
        db='selfDB',
        port=3306,
        charset='utf8')
    cursor = conn.cursor()
    try:
        sql = "call B()"
        cursor.execute(sql)
        conn.commit()
    except Exception as e:
        conn.rollback()
        print e
        print '存储过程执行异常 ERROR'
    conn.close()
    print time.strftime('%Y-%m-%d %X') + '存储完成B'
if __name__ == '__main__':
    B()

.job文件如下:

type=command
command= python B.py 
retries=3
retry.backoff=60000
begin_date=   #此处若不配置,也可以在azkaban配置
end_date=     #此处若不配置,也可以在azkaban配置

编写完之后,打成Zip包上传,建议在azkaban进行任务调度的时间配置。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值