BigQuery数据迁移至华为DWS数仓
BigQuery数据迁移至华为DWS数仓
1. 前言
本文介绍从BigQuery导出数据文件,并将文件传输至华为云对象存储(OBS),通过外表方式将数据导入DWS数仓过程。(华为云数据同步工具CDM服务支持Bigquery->DWS数仓离线同步链路,大批量数据搬迁推荐使用CDM云服务化工具)。
2. 准备工作
- 已准备需要迁移的BigQuery服务。
- 已准备用于导出BigQuery数据的Cloud Storage服务,并创建存储分(Bucket)。
- 已创建拥有访问Cloud Storage权限及数据导出权限的IAM用户。
- 已开华为云对象存储服务(OBS)。
- 已创建DWS数仓实例。
3. 将BigQuery的数据导出到Cloud Storage
将BigQuery的数据导出需要使用bq命令行工具,关于bq命令行工具的使用方法,请参见使用bq命令行工具 。
3.1 DDL导出
使用bq命令行工具查询BigQuery数据集INFORMATION_SCHEMA.TABLES视图中表的DDL语句并下载至本地设备。
表类型有BASE TABLE(标准表),CLONE(表克隆),SNAPSHOT(快照表),VIEW(视图),MATERIALIZED VIEW(物化视图),EXTERNAL(外部数据源表)。
SELECT table_catalog, table_schema, table_name, table_type,is_insertable_into, creation_time, ddl FROM mydataset.INFORMATION_SCHEMA.TABLES
3.2 数据导出
执行bq extract命令,将BigQuery数据集中的表依次导出至Cloud Storage的存储分区中。
如若导出数据为压缩数据,在后续导入至DWS时,需手动创建OBS SEVER,且在创建外表时,指定可兼容压缩格式(text、csv或json支持gzip,parquet支持zlib、snappy、lz4、lz4_hadoop,缺省值为snappy)。
导出示例如下(不建议导出avro格式)。
- 导出parquet格式
bq extract --destination_format= PARQUET my_project.myDataset.myTable gs://my-bucket/my_folder/
- 导出csv格式
bq extract --compression=GZIP --field_delimiter='|' --print_header=false --destination_format=CSV my_project.myDataset.myTable gs://my-bucket/my_folder/myFile.csv.gzip
3.3 验证导出
在Cloud Storage对象存储相应目录下检查导出结果。
4. 将Cloud Storage上的数据同步到华为云OBS
通过rclone同步数据至OBS
- rclone配置Cloud Storage:rclone -> Storage Systems -> Google Cloud Storage
- rclone配置华为OBS: rclone -> Storage Systems -> Amazon S3 Storage Providers -> huawei-obs
通过sync方式同步Cloud Storage桶下对象到华为OBS桶下
rclone sync gcs-backup:bucket-name obs-backup:bucket-name --progress --transfers 8
可参考: rclone -> flags
5. 创建用于装载数据的目标表
在DWS数仓实例中创建用于装载BigQuery的数据的目标表。目标表结构需与源表结构一致,建表语法语法存在差异,请参照语法差异,需要手动迁移。
6. 将OBS数据导入DWS数仓
您可以通过命令通过外表将数据导入DWS数仓。
6.1 创建obs server
指定具有访问OBS对应桶的AK/SK
CREATE SERVER obs_server FOREIGN DATA WRAPPER dfs_fdw
OPTIONS (
address 'XXXXXX' , ---Replace according to actual situation
ACCESS_KEY 'AK', ---Replace according to actual situation
SECRET_ACCESS_KEY 'SK', ---Replace according to actual situation
encrypt 'on',
type 'obs'
);
6.2 创建外表
创建对应目录下的OBS外表,详情见SQL语法参考->DDL语法->表和外部数据源->(PARQUET格式数据)CREATE FOREIGN TABLE (SQL on OBS or Hadoop)。
CREATE foreign table REGION_load(
R_REGIONKEY INT NOT NULL,
R_NAME CHAR(25) NOT NULL,
R_COMMENT VARCHAR(152)
)
server obs_server
options (
LOCATION 'obs://XXX /', ---‘LOCATION’ is replaced according to actual situation
format 'PARQUET',
encoding 'utf8')
read ONLY
DISTRIBUTE BY ROUNDROBIN;
6.3 创建内表
在对应数据库(mysql兼容模式)合适的schema下,创建外表对应的内表。
CREATE TABLE region(
R_REGIONKEY INT NOT NULL,
R_NAME VarCHAR(25) NOT NULL,
R_COMMENT VARCHAR(152)
)
with (orientation = column,enable_hstore_opt=on)
distribute by replication;
- 如若为事实表,distribute 需为 hash分布,分布字段要求为业务强相关的离散字段,多体现在join,group场景下常用字段,如若暂无业务强相关字段,可使用roundrobin分布。
- 如若为维度表,distribute 可为replication分布。
- 报表场景下,表存储选项都需使用opt列存,如有性能要求可指定colversion2.0(默认colversion3.0)。
- 如若需在用户级别直接指定opt默认属性,可通过设置会话级别参数开启opt属性
alter user username set column_default_format='column_hstore_opt'; - 对应的char建议更改为varchar类型。
- varchar长度在16字节以下,numeric在32字节以下,性能会增强。
- 如若有字符串等值过滤,可在表选项添加
bitmap_columns='fieldname1,xx'。
6.4 数据导入
在SQL-Editor任务栏提交导入作业(可多窗口并行提交,单窗口串行)。
INSERT INTO region SELECT * FROM region_load;
7. 语法差异
Bigquery数据类型与DWS数仓数据类型案例展示如下,部分可参考Bigquery与PG的类型映射。
| BigQuery DDL | DWS数仓 3.0 DDL |
|---|---|
| CREATE TABLE analytics-di-dev.ddw_abase.fact_invoice( cd_document STRING, id_location INT64, id_item INT64, id_buyer INT64, id_invoice_type INT64, bl_active BOOL, dt_inactive TIMESTAMP, id_time DATE, vl_quantity_sold FLOAT64, vl_average_sales_price FLOAT64, vl_sales_total_value FLOAT64, vl_taxes FLOAT64, vl_discount FLOAT64, id_sales_team INT64, id_cfop INT64, id_location_pickup INT64, id_buyer_delivery INT64, cd_lot STRING, dt_manufacturing DATE, dt_expiration DATE, vl_quantity_lot FLOAT64, tp_method INT64, cd_agency_sale STRING, id_model INT64, vl_net_sales_total_value FLOAT64, dh_created TIMESTAMP, dh_updated TIMESTAMP, id_time_numeric INT64, id_doc_numeric INT64, nm_last_file STRING, vl_year INT64, vl_month INT64 ) PARTITION BY DATE_TRUNC(id_time, MONTH); |
CREATE TABLE ddw_abase.fact_invoice ( cd_document VARCHAR2, id_location BIGINT, id_item BIGINT, id_buyer BIGINT, id_invoice_type BIGINT, bl_active BOOLEAN, dt_inactive TIMESTAMP, id_time DATE, vl_quantity_sold FLOAT8, vl_average_sales_price FLOAT8, vl_sales_total_value FLOAT8, vl_taxes FLOAT8, vl_discount FLOAT8, id_sales_team BIGINT, id_cfop BIGINT, id_location_pickup BIGINT, id_buyer_delivery BIGINT, cd_lot VARCHAR2, dt_manufacturing DATE, dt_expiration DATE, vl_quantity_lot FLOAT8, tp_method BIGINT, cd_agency_sale VARCHAR2, id_model BIGINT, vl_net_sales_total_value FLOAT8, dh_created TIMESTAMP, dh_updated TIMESTAMP, id_time_numeric BIGINT, id_doc_numeric BIGINT, nm_last_file VARCHAR2, vl_year BIGINT, vl_month BIGINT )WITH (ORIENTATION = COLUMN, enable_hstore_opt = on,PERIOD=‘1 month’) PARTITION BY RANGE(id_time) (partition p1 START(‘2021-01-01’) END (‘2024-12-30’) EVERY (INTERVAL ‘1 month’)) ; |
类型对照
| BigQuery 数据类型 | DWS 数仓数据类型 |
|---|---|
| INT64 | BIGINT |
| FLOAT64 | DOUBLE PRECISION/FLOAT8 |
| NUMERIC | DECIMAL |
| BIGNUMERIC | DECIMAL |
| BOOL | BOOLEAN |
| BYTES(2字节头) | BYTEA |
| STRING/STRING() | TEXT/VARCHAR()/VARCHAR2 |
| DATE | DATE(带时分秒) |
| DATETIME | TIMESTAMP |
| TIME | TIME |
| TIMESTAMP | TIMESTAMP |
| INTERVAL | INTERVAL |
| STRUCT | CREATE TYPE |
| JSON | JSON(列存不支持) |
| GEOGRAPHY | CREATE TYPE/GEOGRAPHY(gis场景需同产品确认支撑粒度) |
- 点赞
- 收藏
- 关注作者
评论(0)