|
@@ -0,0 +1,83 @@
|
|
|
|
|
+#!/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()
|