1.需求分析
为了获得****odps****空间下的所有表的信息(部门、表名、表注释、表记录统计、表字节大小、写入时间),如下脚本可以实现该需求,表为分区表。
2.脚本编辑
"""
-- 获得****_odps_****空间下的所有表的信息
|dept|stg_name|stg_comment|tb_count|tb_size|rksj| (dt)
"""
import time
import datetime
from odps import ODPS
import sys
import io
reload(sys)
sys.setdefaultencoding("utf-8")
# 连接odps
odps = ODPS('x***********9Y', 'cc***************os', 'xsdc_odps_prod',
endpoint='*****************')
print("正常连接到odps({})的项目空间----".format('****_odps_****'))
# 1.遍历信息,获取数据
tableNameList = odps.list_tables(project='****_odps_****',prefix='')
table_data = [];
dept = ''
print("阶段1:数据读取中")
i = 0
for each in tableNameList:
try:
#表
tb_name = each.name
#表注释
tb_comment = each.comment
countsql = "select count(*) from ****_odps_****.{}".format(each.name)
t = odps.execute_sql(countsql).open_reader();
#表统计量
tb_num = t[0]["_c0"]
#字节
tb_size = each.size
#入库时间
now = datetime.datetime.now()
aim_data = (dept,tb_name,tb_comment,str(tb_num),str(tb_size),str(now.strftime('%Y-%m-%d %H:%M:%S')))
table_data.append(aim_data)
i += 1
print(">>> {} :第 {} 条数据 {} 读取完成!".format(now,i,tb_name))
except :pass
print(">>>阶段1完成:共获取stg层{}条数据".format(i))
# 2.获取数据落表
#获取分区日期
today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
yest_dt = yesterday.strftime('%Y%m%d')
print(yest_dt)
#获取目标表
aim_tb = odps.get_table('stg_count_001',project='****_odps_****')
#如果分区存在就删除
aim_tb.delete_partition("dt='%s'"%yest_dt, if_exists=True)
# #写入分区数据
with aim_tb.open_writer(partition="dt='%s'"%yest_dt,create_partition=True) as writer:
for j in range(len(table_data)):
writer.write(table_data[j])
now2 = datetime.datetime.now()
print(">>> {} : 第{}条数据写入完成".format(now2,j+1))
print("阶段2:目标注释信息已经写入表stg_count_001")
# over