业务场景解析:
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进行任务调度的时间配置。