greenplum使用gpfdist与外部表高效导入数据教程

greenplum作为OLAP分析型软件,自然避免不了从外部数据库加载大量的数据,然而传统的ETL数据传输方法(select=>insert)到GP需要经过GP的单点master,效率非常低。

下面介绍外部表用gpfdist快速导入数据:

普通外部表和可写外部表区别:

1、普通外部表只能select,可写外部表只能insert

2、可写外部表没有错误表

3、可写外部表可以指定分布键,如果不指定,默认随机分布;普通外部表只能随机分布

gpfdist优势:

1、直接由segment并发加载

2、直接加载数据文件,并可读写(和选择的外部表类型有关)

3、默认数据随机分配,每个节点负载均衡(和选择的外部表类型有关)

示例:

1、启动gpfdist

安装完GP后,自带gpfdist文件,直接指定目录、端口等就能启动服务。如果需要独立的文件服务器,则需要在文件服务器上单独下载gpfdist使用

[gpadmin@gp-master ~]nohup /disk/GP/bin/gpfdist -p 8081 -d /disk/upload &

使用nohup &是起守护进程作用,不然执行启动服务的客户端关闭后,这个进程也会被关闭;指定端口8081,指定文件服务器目录/disk/upload

[gpadmin@gp-master ~]$ ps -ef|grep gpfdist

gpadmin 816 32606 0 17:08 pts/4 00:00:00 grep gpfdist

gpadmin 13036 1 0 Oct21 ? 00:00:44 /disk/GP/bin/gpfdist -p 8081 -d /disk/upload

2、创建普通外部表

CREATE EXTERNAL TABLE "ods"."order" (

"id" varchar(64),

"create_by" varchar(64),

"create_date" timestamp,

"update_by" varchar(64),

"update_date" timestamp,

"del_flag" char(1),

"user_id" varchar(64),

"user_name" varchar(64),

"account_id" varchar(64),

"equ_def_id" varchar(64),

"amount_in" numeric(20,2),

"amount_in_money" numeric(20,2),

"amount_out" numeric(20,2),

"amount_out_money" numeric(20,2),

"fee" numeric(20,2),

"fee_discount" numeric(20,2),

"money" numeric(20,2),

"actual_pay_money" numeric(20,2),

"discount_money" numeric(20,2),

"pay_time" timestamp,

"order_type" varchar(16),

"status" varchar(64),

"rel_biz_type" varchar(64),

"rel_biz_id" varchar(64),

"equ_agreement" varchar(64),

"remarks" varchar(100),

"transaction_type" varchar(1),

"pay_stop_date" timestamp,

"stop_time" timestamp,

"bid_method" varchar(64),

"profit_fee_rate" numeric(20,2),

"quit_charge_rate" numeric(20,2),

"return_tb" numeric(20,2),

"last_order_id" varchar(64),

"root_order_id" varchar(64),

"invest_name_for_me" varchar(64),

"invest_name_for_buyer" varchar(64),

"invest_start_time" timestamp,

"available_amount" numeric(20,2),

"surplus_days" int4,

"transferable_flag" varchar(64),

"trc_order_id" varchar(64)

) LOCATION ('gpfdist://gp-master:8081/order.csv') format 'csv' (DELIMITER ';');

注意有几个坑:

1、这个实验数据order.csv是生产环境mysql的测试数据,表中有时间类型字段,如果从线上数据导出到txt文本,这个时候你的时间格式就变成了varchar,再导入到GP的时间类型字段时候会报格式错误,所以尽量导出为csv格式的文本

2、指定gpfdist信息:LOCATION ('gpfdist://文件服务器主机名或IP:gpfdist端口/加载文件') format '文件格式' (DELIMITER '分隔字符')

3、从线上数据导出到文本,不要行头,不要封闭符,只需要分隔字符

测试数据90W记录的数据,gpfdist加载数据在秒级别,效率很高

创建可写外部表

CREATE WRITABLE EXTERNAL TABLE "ods"."order1" (

"id" varchar(64),

"create_by" varchar(64),

"create_date" timestamp,

"update_by" varchar(64),

"update_date" timestamp,

"del_flag" char(1),

"user_id" varchar(64),

"user_name" varchar(64),

"account_id" varchar(64),

"equ_def_id" varchar(64),

"amount_in" numeric(20,2),

"amount_in_money" numeric(20,2),

"amount_out" numeric(20,2),

"amount_out_money" numeric(20,2),

"fee" numeric(20,2),

"fee_discount" numeric(20,2),

"money" numeric(20,2),

"actual_pay_money" numeric(20,2),

"discount_money" numeric(20,2),

"pay_time" timestamp,

"order_type" varchar(16),

"status" varchar(64),

"rel_biz_type" varchar(64),

"rel_biz_id" varchar(64),

"equ_agreement" varchar(64),

"remarks" varchar(100),

"transaction_type" varchar(1),

"pay_stop_date" timestamp,

"stop_time" timestamp,

"bid_method" varchar(64),

"profit_fee_rate" numeric(20,2),

"quit_charge_rate" numeric(20,2),

"return_tb" numeric(20,2),

"last_order_id" varchar(64),

"root_order_id" varchar(64),

"invest_name_for_me" varchar(64),

"invest_name_for_buyer" varchar(64),

"invest_start_time" timestamp,

"available_amount" numeric(20,2),

"surplus_days" int4,

"transferable_flag" varchar(64),

"trc_order_id" varchar(64)

) LOCATION ('gpfdist://gp-master:8081/order1.csv') format 'CSV' (DELIMITER ';')

DISTRIBUTED BY (id);

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值