| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #!/usr/bin/env python
- # coding=utf-8
- """
- 查看 ODPS 表结构
- 使用示例:
- python desc_table.py loghubods.opengid_base_data
- python desc_table.py videoods.wx_user_wechar_detail
- """
- import argparse
- from pathlib import Path
- from lib.odps_module import ODPSClient
- PROJECT_ROOT = Path(__file__).parent
- def desc_table(table_name: str):
- """查看表结构,返回格式化的字符串"""
- # 解析 project.table 格式
- if '.' in table_name:
- project, table = table_name.split('.', 1)
- else:
- project = 'loghubods'
- table = table_name
- client = ODPSClient(project=project)
- t = client.odps.get_table(table)
- lines = []
- lines.append(f"表名: {project}.{table}")
- lines.append(f"注释: {t.comment or '(无)'}")
- lines.append(f"创建时间: {t.creation_time}")
- lines.append(f"最后修改: {t.last_data_modified_time}")
- lines.append("")
- lines.append("=" * 60)
- lines.append(f"{'字段名':<30} {'类型':<15} {'注释'}")
- lines.append("=" * 60)
- for col in t.table_schema.columns:
- comment = col.comment or ''
- lines.append(f"{col.name:<30} {col.type.name:<15} {comment}")
- if t.table_schema.partitions:
- lines.append("")
- lines.append("分区字段:")
- lines.append("-" * 60)
- for p in t.table_schema.partitions:
- comment = p.comment or ''
- lines.append(f"{p.name:<30} {p.type.name:<15} {comment}")
- return "\n".join(lines), project, table
- def save_and_print(table_name: str):
- """查看表结构并保存到文件"""
- content, project, table = desc_table(table_name)
- # 输出目录: tables/project/table.txt
- output_dir = PROJECT_ROOT / "tables" / project
- output_dir.mkdir(parents=True, exist_ok=True)
- output_file = output_dir / f"{table}.txt"
- # 保存文件
- with open(output_file, 'w', encoding='utf-8') as f:
- f.write(content)
- # 打印到终端
- print(content)
- print()
- print(f"已保存到: {output_file}")
- def main():
- parser = argparse.ArgumentParser(description='查看 ODPS 表结构')
- parser.add_argument('table', type=str, help='表名,如 loghubods.table_name')
- args = parser.parse_args()
- save_and_print(args.table)
- if __name__ == "__main__":
- main()
|