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_airlinesTable "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,""VirginBlue 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 ERRORSSEGMENT 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.10PORT: 8081FILE: # 文件位置- /mnt/vbox/greenplum-master/test_data/faa/otp*.gz- FORMAT: csv- QUOTE: '"'- ERROR_LIMIT: 50000- LOG_ERRORS: trueOUTPUT:- TABLE: faa.faa_otp_load- MODE: INSERTPRELOAD:- REUSE_TABLES: trueSQL:- 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提供更多的支持和自动化操作,也更方便定制某些特殊的操作,比如监控和统计。

转载于:https://www.cnblogs.com/lanston/p/greenplum_data_loading.html

MPP 二、Greenplum数据加载相关推荐

  1. CANoe软件使用(二)——数据加载分析

    CANoe软件使用(二)--数据加载分析 目录 新建CANoe工程 DBC和通道加载 数据分析 离线设置 数据查看 数据保存 目录 本节主要讲述下离线的CAN数据分析.通常情况下,工程师通过CANoe ...

  2. Graph Convolution Network图卷积网络(二)数据加载与网络结构定义

    背景 : 弄懂Graph Convolution Network的pytorch代码如何加载数据并且如何定义网络结构的. 代码地址:https://github.com/tkipf/pygcn 论文地 ...

  3. pytorch基础知识整理(二)数据加载

    pytorch数据加载组件位于torch.utils.data中. from torch.utils.data import DataLoader, Dataset, Sampler 1, torch ...

  4. pandas数据加载与存储

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.pandas是什么? 二.数据加载与存储 1.引入库 2.读入数据 2.1 读取Excel文件 2.2 读取 tx ...

  5. hive分区、数据加载、数据导出、数据类型

    一.hive分区 1.特点: 分区表与其他表不同点在于,分区字段的值为表目录下的子目录格式 ,为: 分区字段=值 2.建表语句 create database learn2; CREATE TABLE ...

  6. hive外部表改为内部表_3000字揭秘Greenplum的外部数据加载——外部表

    外部表是greenplum的一种数据表,它与普通表不同的地方是:外部表是用来访问存储在greenplum数据库之外的数据.如普通表一样,可使用SQL对外部表进行查询和插入操作.外部表主要用于Green ...

  7. hive内部表和外部表的区别_3000字揭秘Greenplum的外部数据加载——外部表

    外部表是greenplum的一种数据表,它与普通表不同的地方是:外部表是用来访问存储在greenplum数据库之外的数据.如普通表一样,可使用SQL对外部表进行查询和插入操作.外部表主要用于Green ...

  8. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

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

  9. pytorch入门(二):数据加载和处理

    pytorch入门(二):数据加载和处理 小引 数据加载 引包 数据集 编写辅助函数 显示图像及其特征点 定义数据集类 数据处理 组合变换 遍历数据集 其他注意事项 本章对应pytorch官方文档链接 ...

最新文章

  1. 【python教程入门学习】Python零基础入门爬虫项目
  2. GoogleNet - Going deeper with convolutions
  3. java校验字符串是否为json格式
  4. boost::intrusive::rbtree_algorithms用法的测试程序
  5. C#调用vbs脚本实现Windows版Siri
  6. js 方法传递对象参数
  7. HttpClient使用之下载远程服务器中的文件(注意目录遍历漏洞)
  8. Unity Camera的两种模式
  9. 感受野,以及为什么神经网络可以分清猫是猫,狗是狗的直观理解
  10. 辣椒app软件测试,testflight辣椒视频
  11. html 换行特殊符号,html 换行符号
  12. OMC IT监控运维管理平台建设方案
  13. C语言运算符优先级表详解
  14. SOM网络(Kohonen自组织网络)学习第二篇
  15. Linux架设Jsp环境
  16. 遇见未来 | 对话朱贤文,PostgreSQL是一匹即将发力的黑马
  17. ESXI自动关机 ping值检测关机脚本
  18. jm8.6之参数,函数简介
  19. 站内搜索引擎之比较〔转〕
  20. 利用WCF的P2P共享剪贴板上的数据

热门文章

  1. 星辰大海:阿里数据体验技术揭秘!
  2. 我要人人都看到我,但不知道我是谁
  3. 如何“漂亮”地解决dota类游戏网络延迟同步?
  4. 完善vim bccalc_linux插件
  5. 常见Java面试题之静态变量和实例变量的区别
  6. 关于MySQL建表对DML的影响
  7. 安装完Oracle 11g之后启动SQL Developer 时报cannot find a j2se sdk错误的解决办法
  8. Goldengate的拆分与合并
  9. example:利用impdp通过dblink导入数据库
  10. Golang 入门 : 数组