如何仅将Teradata中的表结构(schema)迁移至BigQuery
将Teradata表结构迁移至BigQuery的方法
1. 导出Teradata表的结构信息
- 用
SHOW TABLE命令直接获取建表DDL:
执行后会返回该表完整的Teradata建表语句,包含字段名、数据类型、约束等全部结构信息。SHOW TABLE your_database.your_table; - 也可以查询数据字典视图
DBC.ColumnsV获取字段明细:
这种方式适合需要批量处理或自定义结构转换的场景。SELECT ColumnName, ColumnType, ColumnLength, DecimalTotalDigits, DecimalFractionalDigits FROM DBC.ColumnsV WHERE DatabaseName = 'your_database' AND TableName = 'your_table' ORDER BY ColumnId;
2. 映射Teradata与BigQuery数据类型
需要把Teradata的数据类型转换成BigQuery兼容的类型,常见映射规则:
- Teradata
INT/INTEGER→ BigQueryINT64 - Teradata
VARCHAR(n)/CHAR(n)→ BigQuerySTRING(BigQuery的STRING无需指定长度,若要限制可写STRING(n)) - Teradata
DECIMAL(p,s)/NUMERIC(p,s)→ BigQueryNUMERIC(p,s) - Teradata
DATE→ BigQueryDATE - Teradata
TIMESTAMP(6)→ BigQueryTIMESTAMP - Teradata
FLOAT/DOUBLE→ BigQueryFLOAT64 - Teradata
BOOLEAN→ BigQueryBOOL
3. 编写BigQuery建表语句
根据转换后的字段信息和类型,编写符合BigQuery语法的CREATE TABLE语句,注意约束的差异:
- BigQuery的主键默认是逻辑约束,需添加
NOT ENFORCED(可省略,默认就是非强制);如果需要强制唯一,使用UNIQUE约束。 - 非空约束写法和Teradata一致,用
NOT NULL。
示例转换:
Teradata原建表语句:
CREATE TABLE sales.order_details ( order_id INT NOT NULL, product_code VARCHAR(20) NOT NULL, quantity INT, unit_price DECIMAL(8,2), order_date DATE, PRIMARY KEY(order_id, product_code) );
转换为BigQuery语句:
CREATE TABLE `your_gcp_project.your_bq_dataset.order_details` ( order_id INT64 NOT NULL, product_code STRING NOT NULL, quantity INT64, unit_price NUMERIC(8,2), order_date DATE, PRIMARY KEY(order_id, product_code) NOT ENFORCED );
4. 在BigQuery中执行DDL
可以通过以下方式执行生成的建表语句:
- BigQuery控制台:打开SQL编辑器,粘贴语句后点击「运行」。
- bq命令行工具:
bq query --use_legacy_sql=false 'CREATE TABLE `your_gcp_project.your_bq_dataset.order_details` (...);' - 客户端SDK:用Python、Java等语言的BigQuery SDK执行DDL语句。
内容的提问来源于stack exchange,提问作者AnirudhTEAM
相关产品推荐
相关产品推荐

