MPP 二、Greenplum数据加载

时间:2022-08-26 20:57:52

Loading external data into greenplum database table using different ways...

Greenplum 有常规的COPY加载方法,有基于分布式的并行的gpfdist加载方法;COPY方式适合用于加载小数据;gpfdist适合大数据量加载;下文中将讨论这两种数据加载方式。

gp_sydb=# select current_database(),current_user,current_schema(),session_user,current_timestamp,version();

current_database | gp_sydb
current_user | gpadmin
current_schema | faa
session_user | gpadmin
now | 2017-06-04 15:33:01.000678+08
version | PostgreSQL 8.3.23 (Greenplum Database 5.0.0-alpha.5 build commit:2e87c5aa435c779b2f3837fa8c7273876497f6ba) on x86_64-pc-linux-gnu, compiled by GCC gcc (GCC) 6.2.0 compiled on May 19 2017 18:14:12

1 COPY方式加载数据

使用COPY方式加载外部文件,可以指定文件类型、文件格式、日志信息,greenplum便会自动解析,将数据加载到目标表,这种方式比单纯的insert语句效率高,但它不是并行的,适合于加载少量数据。比如有如下包含两列的csv数据(csv数据和表结构可以在gpdb-sandbox-tutorials上获取到);

[gpadmin@gp-master faa]$ more L_AIRLINE_ID.csv
Code,Description
"19031","Mackey International Inc.: MAC"
"19032","Munz Northern Airlines Inc.: XY"
"19033","Cochise Airlines Inc.: COC"
"19034","Golden Gate Airlines Inc.: GSA"
"19035","Aeromech Inc.: RZZ"
"19036","Golden West Airlines Co.: GLW"
"19037","Puerto Rico Intl Airlines: PRN"
"19038","Air America Inc.: STZ"
"19039","Swift Aire Lines Inc.: SWT"
"19040","American Central Airlines: TSF"
"19041","Valdez Airlines: VEZ"
"19042","Southeast Alaska Airlines: WEB"
"19043","Altair Airlines Inc.: AAR"
"19044","Chitina Air Service: CHI"
"19045","Marco Island Airways Inc.: MRC"
"19046","Caribbean Air Services Inc.: OHZ"
"19047","Sundance Airlines: PRO"
"19048","Seair Alaska Airlines Inc.: SAI"

在数据库中创建相同结构的分布表;

gp_sydb=# \d faa.d_airlines
Table "faa.d_airlines"
Column | Type | Modifiers
--------------+---------+-----------
airlineid | integer |
airline_desc | text |
Distributed by: (airlineid)

将外部文件的数据加载到分布表中;

\COPY faa.d_airlines FROM 'L_AIRLINE_ID.csv' CSV HEADER
LOG ERRORS
SEGMENT REJECT LIMIT 500 ROWS;

LOG ERRORS 表示将有问题无法正常导出的数据记录到系统表中,数据加载完成后可以通过如下的语句查询到有问题无法正常导入的数据。

gp_sydb=# SELECT gp_read_error_log('D_AIRLINES');
gp_read_error_log
------------------------------------------------------------------------------------------------------------
("2017-06-04 12:07:13.151372+08",d_airlines,<stdin>,1517,,"unterminated CSV quoted field","""21395,""Virgin
Blue International Airlines t/a V Australia: VA""\r

这种方式导入数据和在oracle中通过sqlload,在mysql中通过load导入数据很相似,对于错误的监控greenplum也做得比较完善。对于csv文件,greenplum要求首行指定数据列名;其它的格式的文件,我们可能要指定分割符,结束符,这些都是统一的,比如|分隔换行符结束的text文件的导入;

\COPY country FROM '/data/gpdb/data01.txt'
WITH DELIMITER '|' LOG ERRORS
SEGMENT REJECT LIMIT 10 ROWS;

2 GPFDIST方式加载数据

gpfdist程序运行在数据存放的节点上,它将数据均匀分布到每个节点上,它是并行工作的,文件可以是按照特定格式存储后压缩的gzip文件,也可以是未压缩的原文件;这种方式适用于大数据加载。假设要加载如下的已经压缩的csv数据;

[gpadmin@gp-master faa]$ ls -ltr --block-size m otp*.gz
-rwxrwxrwx 1 root root 31M Aug 6 2012 otp200912.gz
-rwxrwxrwx 1 root root 30M Aug 6 2012 otp201001.gz

要将这些数据加载到faa.faa_otp_load表,我们需要先创建gpfdist进程;

[gpadmin@gp-master faa]$ gpfdist -d /mnt/vbox/greenplum-master/test_data/faa -p 8081 > /tmp/gpfdist.log 2>&1 &
[1] 19533

gpfdist类似文件服务器,需要指定端口,文件目录信息;gpfdist创建以后需要创建一张external table;

CREATE EXTERNAL TABLE faa.ext_load_otp
(LIKE faa.faa_otp_load)
LOCATION ('gpfdist://192.168.56.10:8081/otp*.gz')
FORMAT 'csv' (header)
LOG ERRORS SEGMENT REJECT LIMIT 50000 rows;

因为gpfdist要将数据均匀的分布到每个节点上,所以创建EXTERNAL TABLE时LOCATION中指定的地址要是集群内的节点能够访问的地址,如果指定为127.0.0.1仅仅是当前服务器可以访问,其它节点访问不了,系统会报错拒绝连接。

gp_sydb=# INSERT INTO faa.faa_otp_load SELECT * FROM faa.ext_load_otp;
ERROR: connection with gpfdist failed for gpfdist://localhost:8081/otp*.gz. effective url: http://127.0.0.1:8081/otp*.gz. error code = 111 (Connection refused) (seg2 slice1 192.168.56.12:40002 pid=3546)

从external table加载数据到表中;

gp_sydb=# INSERT INTO faa.faa_otp_load SELECT * FROM faa.ext_load_otp;
NOTICE: Found 26526 data formatting errors (26526 or more input rows). Rejected related input data.
INSERT 0 1024552
gp_sydb=# select count(*) from faa.faa_otp_load;
count
---------
1024552
(1 row)

Greenplum也支持通过external table对外部文件的访问,但数据不能存放到内存中,每次操作成本很高。

gp_sydb=# select count(*) from faa.ext_load_otp;
NOTICE: Found 26526 data formatting errors (26526 or more input rows). Rejected related input data.
count
---------
1024552
(1 row)

查看加载错误的数据(在external table表上查看);

SELECT gp_read_error_log('faa.ext_load_otp');

最后停止gpfdist进程;

[gpadmin@gp-master faa]$ killall gpfdist

3 GPLOAD

gpfdist的操作需要我们一步步的配置和执行,Greenplum提供了一个封装好的依赖配置的工具GPLOAD;首先我们创建所需的配置文件gpload01.yaml和操作日志表faa.load_audit;

create table faa.load_audit(tname varchar(100),tnode varchar(300),tdate timestamp);

vi gpload01.yaml

---
VERSION: 1.0.0.1
DATABASE: gp_sydb # 数据库名称
USER: gpadmin # 用户名
HOST: 192.168.56.10
PORT: 5432
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- 192.168.56.10
PORT: 8081
FILE: # 文件位置
- /mnt/vbox/greenplum-master/test_data/faa/otp*.gz
- FORMAT: csv
- QUOTE: '"'
- ERROR_LIMIT: 50000
- LOG_ERRORS: true
OUTPUT:
- TABLE: faa.faa_otp_load
- MODE: INSERT
PRELOAD:
- REUSE_TABLES: true
SQL:
- BEFORE: "INSERT INTO faa.load_audit VALUES('faa.faa_otp_load','start', current_timestamp)"
- AFTER: "INSERT INTO faa.load_audit VALUES('faa.faa_otp_load','end', current_timestamp)"

注意检查端口是否被占用,文件路径是否正确;最后执行加载;

[gpadmin@gp-master faa]$ gpload -f gpload01.yaml -l gpload01.log
2017-06-04 14:05:58|INFO|gpload session started 2017-06-04 14:05:58
2017-06-04 14:05:58|INFO|started gpfdist -p 8081 -P 8082 -f "/mnt/vbox/greenplum-master/test_data/faa/otp*.gz" -t 30
2017-06-04 14:05:58|INFO|did not find an external table to reuse. creating ext_gpload_reusable_e0c13d44_48eb_11e7_868b_0800279a5c02
2017-06-04 14:06:32|WARN|2084 bad rows
2017-06-04 14:06:32|WARN|Please use following query to access the detailed error
2017-06-04 14:06:32|WARN|select * from gp_read_error_log('ext_gpload_reusable_e0c13d44_48eb_11e7_868b_0800279a5c02') where cmdtime = '2017-06-04 14:05:58.88747+08'
2017-06-04 14:06:32|INFO|running time: 34.07 seconds
2017-06-04 14:06:32|INFO|rows Inserted = 1024552
2017-06-04 14:06:32|INFO|rows Updated = 0
2017-06-04 14:06:32|INFO|data formatting errors = 2084
2017-06-04 14:06:32|INFO|gpload succeeded with warnings

日志提示临时创建的external table,数据插入、更新、错误信息,还提示怎么查看错误数据。

gp_sydb=# select count(*) from faa.faa_otp_load;
count
---------
1024552
(1 row)

GPLOAD提供更多的支持和自动化操作,也更方便定制某些特殊的操作,比如监控和统计。

MPP 二、Greenplum数据加载的更多相关文章

  1. GreenPlum数据加载

    1. copy命令 对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.使用copy命令进行 ...

  2. Pytorch系列&colon;(二)数据加载

    DataLoader DataLoader(dataset,batch_size=1,shuffle=False,sampler=None, batch_sampler=None,num_worker ...

  3. ScrollView嵌套ListView&comma;GridView数据加载不全问题的解决

    我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...

  4. Android4&period;0图库Gallery2代码分析&lpar;二&rpar; 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  5. CAD从二进流加载数据(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::ReadBinStreamEx 从二进流加载数据,详细说明如下: 参数 说明 IMxDrawBinStream* pBinStream ...

  6. flask&plus;sqlite3&plus;echarts3&plus;ajax 异步数据加载

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  7. Entity Framework关联查询以及数据加载(延迟加载,预加载)

    数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...

  8. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  9. APP中数据加载的6种方式-b

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

随机推荐

  1. insert into linksvr or insert into from linksvr

    通过链接服务器将实例A上的数据写入实例B,通常有以下两种方式--方案1:在实例A上执行insert into LinkForB.B..TableB select * from TableA--方案2: ...

  2. 在Ubuntu上安装docker常见问题

    安装完docker之后,发现docker是装好了,但是运行docker就会报“Segmentation Fault or Critical Error encountered. Dumping cor ...

  3. 疯狂的ASP&period;NET系列-第一篇:啥是ASP&period;NET

    最近想学下ASP.NET,于是在网店上看到一本书叫做ASP.NET高级程序设计,老婆在旁边问了句:“这个不是DSP(数字信号处理,大学读的电子,所以这个比较熟),是ASP啊,什么是ASP啊?”.我想了 ...

  4. JSP out乱码

    在form method="post" 写post 在接受页面jsp代码前面加request.setCharacterEncoding("UTF-8");

  5. Bootstrap CSS 描述

    <!DOCTYPE html><html lang="zh-CN"><head> <!--定于内容,和内容的编码格式--> < ...

  6. Android NDK调试C&plus;&plus;源码&lpar;转&rpar;

    [原创文章,转载请保留或注明出处,http://download.csdn.net/download/bigmaxim/5474055] 1. 相关软件 adt-bundle-windows-x86. ...

  7. 当前位置&colon; 银光首页 &gt&semi; WPF &gt&semi; WPF学习教程 &gt&semi; WPF: ShowDialog&lpar;&rpar; 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方

    转自http://www.silverlightchina.net/html/study/WPF/2012/0723/17608.html

  8. expandableListView的divider该溶液显示在黑色

    黑色是divider高度.如何让他成为透明的啊? 布局例如以下:   <ExpandableListView android:layout_width="wrap_content&qu ...

  9. 2016第七届 蓝桥杯 全国总决赛B题&lpar;完全平方数&rpar; (练习)

    道友给看了一道题目,就记录一下吧 题目: 给你0,1,2,3,4,5,6,7,8,9十个数字,要你选出任意一个或几个组合在一起成为完全平方数,每个数字都必须选且只能选一次,求可能的方案. 比如有其中几 ...

  10. MySQL学习笔记&lowbar;10&lowbar;MySQL高级操作(下)

    MySQL高级操作(下) 五.MySQL预处理语句 1.设置预处理stmt,传递一个数据作为where的判断条件 prepare stmt from "select * from table ...