BigQuery数据迁移至华为DWS数仓

举报
yd_257652223 发表于 2025/12/18 14:46:28 2025/12/18
【摘要】 BigQuery数据迁移至华为DWS数仓 1. 前言 2. 准备工作 3. 将BigQuery的数据导出到Cloud Storage 3.1 DDL导出 3.2 数据导出 3.3 验证导出 4. 将Cloud Storage上的数据同步到华为云OBS 5. 创建用于装载数据的目标表 6. 将OBS数据导入DWS数仓 ...

BigQuery数据迁移至华为DWS数仓

1. 前言

本文介绍从BigQuery导出数据文件,并将文件传输至华为云对象存储(OBS),通过外表方式将数据导入DWS数仓过程。(华为云数据同步工具CDM服务支持Bigquery->DWS数仓离线同步链路,大批量数据搬迁推荐使用CDM云服务化工具)。

2. 准备工作

  1. 已准备需要迁移的BigQuery服务。
  2. 已准备用于导出BigQuery数据的Cloud Storage服务,并创建存储分(Bucket)。
  3. 已创建拥有访问Cloud Storage权限及数据导出权限的IAM用户。
  4. 已开华为云对象存储服务(OBS)。
  5. 已创建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场景需同产品确认支撑粒度)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。