历史数据清理--方案

 

1.       数据库历史数据清理

 

#创建历史表

create table ag_alert_record_history asselect * from ag_alert_record;

 

select * from ag_alert_record wheremessage_time between sysdate-90 and sysdate order by message_time desc;

 

 

#删除ag_alert_record中90天之前的数据

delete from ag_alert_record where message_time >= trunc(sysdate-20 and message_time <trunc(sysdate-10);

--delete from ag_alert_record wheremessage_time <= sysdate-365;

 

 

#job启动,job第1天同步前1天的数据到历史表中

##1. 创建存储过程

create or replace procedureag_alert_record_synchronous  as  

    begin

  

    insert intoag_alert_record_history

 

(mon_id,message_time,send_time,sender,worker_id,status,response_time,handle_time,handle_user,rule_id,node_no,assembled_mon_id,focus_title)

select

t.mon_id,t.message_time,t.send_time,t.sender,t.worker_id,t.status,t.response_time,t.handle_time,t.handle_user,t.rule_id,t.node_no,t.assembled_mon_id,t.focus_titlefrom ag_alert_record t

wheret.message_time >= trunc(sysdate-1 and t.message_time < trunc(sysdate)order by t.message_time desc;

 

delete from ag_alert_record wheremessage_time <= sysdate-365;

 

end;

 

 

##2. 创建job,第一次在凌晨12点执行,以后每隔1天处理一次

declare job1 number;  

begin 

 dbms_job.submit(job1, 

     what => 'wscde.ag_alert_record_synchronous;', 

     next_date=> to_date('2017-02-23 00:59:59', 'YYYY-MM-DD HH24:MI:SS'), 

     interval=> 'sysdate+1');  

   commit; 

end;

 

##3. 查询job生成的id

select job,broken,what,interval,t.* fromuser_jobs t; 

 

##4.启动job

begin   

     dbms_job.run(24); --jod id  

end;

 

2.       MVC前端历史数据查询修改

 

2.1   删除目前ag_alert_records表数据,不会造成原来逻辑改动,页面控制

 

2.2   新增历史数据查询页面功能,或,实现查询时间实时表与历史表数据拼接返回结果

 

3.       ag_alert_records_history 保存1年记录,一年前的数据导出入文档备份,若未来需要审计,则通过恢复备份数据实现

具体方案:

1.      导出ag_alert_records_history为归档文件,保存

2.      清理ag_alert_records_history 一年前的数据

3.      每隔一年人工备份一次一年前的数据


其中涉及赋权的sql语句如下:

grant execute onag_alert_record_synchronous to wsjob;
grant ALL on AG_ALERT_RECORD_SYNCHRONOUS to wsjob;


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是关于如何实现Delta Lake小文件合并以及历史数据自动清理的功能,以下是一个实际的案例,以及对应的PySpark代码和详细解释。 案例背景:假设我们有一个Delta Lake,其中包含了每天用户的点击行为数据。但是由于数据量庞大,每天会产生大量的小文件,这些小文件会影响查询性能,因此需要将小文件合并成大文件。另外,我们需要自动清理历史数据,以保证中数据的时效性和查询效率。 解决方案:我们可以使用PySpark的Delta Lake API来实现小文件合并和历史数据自动清理的功能。具体步骤如下: 1. 安装PySpark和Delta Lake库 ``` !pip install pyspark !pip install delta-spark ``` 2. 创建Delta Lake ``` from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("delta_lake_example") \ .getOrCreate() # 创建Delta Lake df = spark.range(1000) df.write.format("delta").mode("overwrite").save("/mnt/delta_lake/clicks") ``` 3. 小文件合并 使用`OPTIMIZE`命令可以将小文件合并成大文件,从而提高查询性能。`OPTIMIZE`命令将会为重新组织数据,删除删除掉已删除记录,将小文件合并成大文件,并重新构建索引等。 ``` from delta.tables import * from pyspark.sql.functions import * # 加载Delta Lake deltaTable = DeltaTable.forPath(spark, "/mnt/delta_lake/clicks") # 合并小文件 deltaTable \ .alias("clicks") \ .merge(mergeSchema=True) \ .whenMatchedUpdateAll() \ .whenNotMatchedInsertAll() \ .execute() ``` 4. 历史数据自动清理 为了保证中数据的时效性和查询效率,我们可以设置一个定时任务,定期清理过期的数据。Delta Lake提供了`VACUUM`命令来清理过期数据。 ``` # 设置过期天数 retention_days = "7" # 清理过期数据 deltaTable.vacuum(retention_hours=int(retention_days)*24) ``` 5. 完整的PySpark代码 ``` # 安装PySpark和Delta Lake库 !pip install pyspark !pip install delta-spark # 创建Delta Lake from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("delta_lake_example") \ .getOrCreate() df = spark.range(1000) df.write.format("delta").mode("overwrite").save("/mnt/delta_lake/clicks") # 小文件合并 from delta.tables import * from pyspark.sql.functions import * deltaTable = DeltaTable.forPath(spark, "/mnt/delta_lake/clicks") deltaTable \ .alias("clicks") \ .merge(mergeSchema=True) \ .whenMatchedUpdateAll() \ .whenNotMatchedInsertAll() \ .execute() # 历史数据自动清理 retention_days = "7" deltaTable.vacuum(retention_hours=int(retention_days)*24) ``` 以上就是实现Delta Lake小文件合并和历史数据自动清理的完整PySpark代码和详细解释。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值