使用 PyODPS 统计 ODPS 空间内的表数据信息

使用 python 统计 ODPS 空间内的表和数据情况。

创建统计表
CREATE TABLE `table_statistics` (
	`table_name` string COMMENT '表名',
	`partition_name` string COMMENT '最新分区',
	`chinese_name` string COMMENT '中文表名',
	`column_count` bigint COMMENT '字段数量',
	`column_comment_null_count` bigint COMMENT '字段注释缺失数量',
	`pt_count` bigint COMMENT '分区数量',
	`data_count` bigint COMMENT '最新分区数据量'
) 
COMMENT '数据情况统计'
 PARTITIONED BY (dt string)
LIFECYCLE 180;
部署 PyODPS 任务
# -*- coding: utf-8 -*-
from odps import ODPS
import datetime

dt_str = (datetime.datetime.now()+datetime.timedelta(days=-1)).strftime('%Y%m%d')
rid_list = []
wd = []
for t in o.list_tables():
    table_name = t.name
    # 过滤非业务表
    if table_name[:3] not in ('stg', 'dim'):
        continue
    # 过滤利旧数据表
    if table_name in rid_list:
        continue
    chinese_name = t.comment.encode('utf-8')
    cs = [c for c in t.schema.columns]
    column_count = len(cs)
    column_comment_null_count = 0
    for c in cs:
        if c.comment == '' or c.comment == 'null':
            column_comment_null_count += 1
    cnt_sql = ''
    new_pt = ''
    if t.schema.partitions:
        pi = t.iterate_partitions()
        ps = [p for p in pi]
        pt_count = len(ps)
        if len(ps) == 0:
            continue
        new_pt = str(ps[-1])
        if ',' in new_pt: # 多级分区的情况
            new_pt = new_pt.replace(',', ' and ')
        cnt_sql = "select count(1) from %s where %s" % (table_name, new_pt)
        print(cnt_sql)
    else:
    	pt_count = 1
        cnt_sql = "select count(1) from %s " % (table_name)
    with o.execute_sql(cnt_sql).open_reader() as reader:
        data_count = reader[0][0]
        wd.append([table_name, str(new_pt), chinese_name, column_count, column_comment_null_count, 
                   pt_count, data_count])

sta_table = o.get_table("table_statistics")
sta_table.delete_partition('dt=%s'%dt_str, if_exists=True)
with sta_table.open_writer(partition=('dt=%s'%dt_str), create_partition=True) as writer:
    writer.write(wd)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyODPS提供了一些高并发查询ODPS的方法,这些方法可以帮助我们提高查询效率。下面介绍两种常用的高并发查询方法: 1. 使用SQL语句进行高并发查询 使用SQL语句进行高并发查询是一种常见的方法,可以使用PyODPS的execute_sql方法实现。该方法可以同时执行多个SQL语句,并返回多个查询结果。下面是一个示例代码: ```python from odps import ODPS # 创建ODPS连接 odps = ODPS('your_access_id', 'your_access_key', 'your_project_name', 'your_endpoint') # 定义多个SQL语句 sqls = [ 'SELECT * FROM table1', 'SELECT * FROM table2', 'SELECT * FROM table3', 'SELECT * FROM table4', 'SELECT * FROM table5' ] # 执行多个SQL语句 results = odps.execute_sql(sqls) # 处理查询结果 for i, result in enumerate(results): print(f'Table {i+1} result:') for record in result: print(record) ``` 以上代码中,首先创建了ODPS连接,然后定义了5个SQL语句。接着使用execute_sql方法同时执行这5个SQL语句,并返回5个查询结果。最后,遍历每个查询结果,打印查询结果中的每一条记录。 2. 使用TableTunnel进行高并发查询 使用TableTunnel进行高并发查询是另一种常见的方法,可以使用TableTunnel的多线程查询功能实现。TableTunnel的多线程查询功能可以同时从多个分区中读取数据,并发地进行数据传输。下面是一个示例代码: ```python from concurrent.futures import ThreadPoolExecutor from odps import ODPS from odps.tunnel import TableTunnel from odps.tunnel.pool import TableTunnelPool # 创建ODPS连接 odps = ODPS('your_access_id', 'your_access_key', 'your_project_name', 'your_endpoint') def download_table(table_name): # 创建TableTunnel连接池 pool = TableTunnelPool(odps) # 从连接池中获取TableTunnel连接 tunnel = pool.get_tunnel() # 通过TableTunnel连接进行数据传输 with tunnel.create_download_session(table_name) as download: # 处理下载的数据 for record in download.read_record(): print(f'Table {table_name}, record: {record}') # 创建线程池 executor = ThreadPoolExecutor(max_workers=5) # 提交任务到线程池 table_names = ['table1', 'table2', 'table3', 'table4', 'table5'] for table_name in table_names: executor.submit(download_table, table_name) ``` 以上代码中,首先创建了ODPS连接,然后创建了一个线程池,并提交了5个任务到线程池。每个任务都会使用一个独立的TableTunnel连接池,并下载指定的。在下载过程中,每个线程都会从连接池中获取一个连接,并使用该连接进行数据传输。传输完成后,连接会自动回收到连接池中,不需要手动关闭。 需要注意的是,以上示例中使用了线程池,线程池的最大并发数由max_workers参数指定,默认值为当前机器的CPU核心数。如果需要修改线程池的配置,可以通过传递参数进行配置,例如: ```python executor = ThreadPoolExecutor(max_workers=10) ``` 以上代码中,将线程池的最大并发数设置为10。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值