greenplum中怎么使用gpfdist与外部表高效导入数据
本篇内容介绍了“greenplum中怎么使用gpfdist与外部表高效导入数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
greenplum作为OLAP分析型软件,自然避免不了从外部数据库加载大量的数据,然而传统的ETL数据传输方法(select=>insert)到GP需要经过GP的单点master,效率非常低。
下面介绍外部表用gpfdist快速导入数据:
普通外部表和可写外部表区别:
普通外部表只能select,可写外部表只能insert
可写外部表没有错误表
可写外部表可以指定分布键,如果不指定,默认随机分布;普通外部表只能随机分布
gpfdist优势:
直接由segment并发加载
直接加载数据文件,并可读写(和选择的外部表类型有关)
默认数据随机分配,每个节点负载均衡(和选择的外部表类型有关)
示例:
启动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
创建普通外部表
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 ';');
注意有几个坑:
这个实验数据order.csv是生产环境mysql的测试数据,表中有时间类型字段,如果从线上数据导出到txt文本,这个时候你的时间格式就变成了varchar,再导入到GP的时间类型字段时候会报格式错误,所以尽量导出为csv格式的文本
指定gpfdist信息:LOCATION ('gpfdist://文件服务器主机名或IP:gpfdist端口/加载文件') format '文件格式' (DELIMITER '分隔字符')
从线上数据导出到文本,不要行头,不要封闭符,只需要分隔字符
测试数据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);
“greenplum中怎么使用gpfdist与外部表高效导入数据”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341