gpload的简单实用
准备工作:
1.因为gpload是对gpfdist的封装,因此使用gpload之前必须开启gpfdist的服务,不然无法使用。
gpfdist -d /home/admin -p 8181 -l /tmp/gpfdist.log &
开启服务的命令这里就不详解,可以参考我之前讲解的gpfdist文档: http://www.cnblogs.com/daojiao/p/4589038.html
2.系统需要安Python工具,因为我用的是红帽子系统(redhat),内置了此工具,因此不需要安装。
3.首先准备数据文件(这里就补贴数据文件了,直接打印出文件名及文件中的书):
4.GP库中创建装载数据的表:
create table member_delta
(
mever_id varchar(54)
,phoneno varchar(20)
,action char(1)
,dw_ins_date date
)
with
(
appendonly=true ,compresslevel=5
)
distributed by (mever_id)
partition by list (action)
(
partition u values('U'),
partition i values('I'),
partition d values('D'),
default partition other_action
)
;
表结构大概讲解下: 这张表附加了分布键,数据压缩,数据分区等功能。
开始gpload的编码:
创建执行的脚本(这里的脚本就是上面所提到的Python语言),文件名为member.yml:
VERSION: 1.0.0.1
DATABASE: Test
USER: gpadmin
HOST: 192.168.23.128
PORT: 5432
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- mdw
PORT: 8181
FILE:
- /home/admin/member_delta.txt
- COLUMNS:
- mever_id: varchar(54)
- phoneno: varchar(20)
- action: char(1)
- dw_ins_date: date
- FORMAT: text
- DELIMITER: ' '
- QUOTE: '"'
- HEADER: true
- ERROR_LIMIT: 25
- ERROR_TABLE: public.member_err
OUTPUT:
- TABLE: public.member_delta
- MODE: INSERT
脚本所用参数的含义
VERSION: 1.0.0.1 --指定控制文件schema的版本
DATABASE: db_name --指定连接数据库的名字,如果没有指定,由环境变量$PGDATABASE,或者通过gpload参数-d指定
USER: db_username --指定连接目标数据库的用户名,如果不使用超级管理员,服务参数gp_external_grant_privileges必须设置成on。
HOST: master_hostname --指定master主机名,也可以通过gpload的-h选项,或者环境变量$PGHOST指定
PORT: master_port --指定master的连接端口号,默认是5432,或者通过gpload命令的-p选项或者环境变量$PGPORT指定。
GPLOAD: --必须指定,表示装载设置部分在它下面必须定义INPUT:和OUTPUT:两个部分。
INPUT: --必须指定,这部分指定装载数据的格式和位置
- SOURCE: --必须指定,定义source文件的位置,每个输入部分可以定义多个source部分, windows路径的指定比较特别,比如c:\ 要写成 c:/
LOCAL_HOSTNAME: --指定gpload运行的主机名称和ip地址,如果有多块网卡,可以同时使用它们,提高装载速度。默认只使用首选主机名和IP。
- hostname_or_ip
PORT: http_port --指定gpfdist使用的端口,也可以选择端口范围,由系统选择,如果同时指定,port设置优先级高。
| PORT_RANGE: [start_port_range, end_port_range]
FILE: --指定装载数据文件的位置,目录或者命名管道。如果文件使用gpzip或者bzip2进行了压缩,它可以自动解压。可以使用通配符*和C语言风格的关系匹配模式指定多个文件。
- /path/to/input_file
- COLUMNS: --指定数据源的数据格式,如果没有指定这部分,source表的列顺序,数量,以及数据类型必须与目标表一致。
- field_name: data_type
- FORMAT: text | csv --指定文件格式是text还是csv
- DELIMITER: 'delimiter_character' --指定文本数据域(列)之间的分割符,默认是|
- ESCAPE: 'escape_character' | 'OFF' --text定义转义字符,text格式默认是\,在text格式中可以选择off关掉转义字符(web log处理时比较有用)
- NULL_AS: 'null_string' --指定描述空值的字符串,text格式默认是\N,csv格式不使用转义符号的空值。
- FORCE_NOT_NULL: true | false --csv格式,强制所有字符默认都用”“括起,因此不能有空值,如果两个分割符之间没有值,被当做0长度字符串,认为值已经丢失。
- QUOTE: 'csv_quote_character' --csv指定转义字符,默认是"
- HEADER: true | false --是否跳过数据文件第一行,当做表头
- ENCODING: database_encoding --指定数据源的字符集
- ERROR_LIMIT: integer --指定由于不符合格式数据记录的上限,如果超过该上限,gpload停止装载,否则正确记录可以被装载,错误记录抛出写入错误表。但它仅支持数据格式错误,不支持违背约束的问题
- ERROR_TABLE: schema.table_name --指定不符合格式要求记录的错误表。如果指定的表不存在系统自动创建。 OUTPUT:
- TABLE: schema.table_name --指定装载的目标表
- MODE: insert | update | merge --指定操作模式,默认是insert。merge操作不支持使用随机分布策略的表。
- MATCH_COLUMNS: --为update操作和merge操作指定匹配条件。
- target_column_name
- UPDATE_COLUMNS: --为update操作和merge操作指定更新的列
- target_column_name
- UPDATE_CONDITION: 'boolean_condition' --指定where条件,目标表中只有满足条件的记录才能更改,(merge情况下,只有满足条件的记录才能insert)
- MAPPING: --指定source列和目标列的映射关系。
target_column_name: source_column_name | 'expression'
PRELOAD: --指定load之前的操作
- TRUNCATE: true | false --如果设置成true,装载之前先删除目标表中所有记录,再装载
- REUSE_TABLES: true | false --设置成true,不会删除外部表对象会这中间表对象。从而提升性能。
SQL:
- BEFORE: "sql_command" --装载操作开始前执行的SQL,比如写日志表
- AFTER: "sql_command" --装载操作之后执行的SQL。
执行脚本:
脚本完成后,放在指定服务器位置,比如/home/command/ 目录下
进入服务器找到存放脚本的目录: cd /home/command/ 执行该脚本
执行命令为:gpload -f member.yml 脚本执行完后,打印台会得到如下信息:
查询member_delta,看数据是否添加成功:
select * from member_delta;
总结:
今天写这个例子,虽然是一个简单的例子,但大概让我知道gpload执行的流程是什么。写这个脚本也折腾了不少时间,关键没人教你,从头到尾都是自己在摸索,不懂baidu,不懂翻书,一句话为了写出这个程序不择手段的进行各种尝试,其中的抓狂无奈……但和结果比起来却现的那么微不足道,写飘了,进入正题,今天遇到一个蛋疼的问题就是不够认真,脚本中的个别关键字写错了,确实比较捉急,还有就是刚开始没找到正规的文档,随手捏来一个例子,不知道意思改了半天,这样做真的很浪费时间,对于这个处理个人感觉尽量找官方文档,查看具体每个参数的含义,那些可以写,那些可以省掉。在开始写的时候保证基本语法通过就OK了,不要写太多无用的参数。
gpload的简单实用的更多相关文章
- jQuery的几种简单实用效果
许久未分享博客,或许已生疏. 闲来无事, 分享几个jQuery简单实用的效果案例 不喜勿喷... 1.页面常用的返回顶部 <!DOCTYPE html> <html lang=&qu ...
- 经验分享:10个简单实用的 jQuery 代码片段
尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...
- 简单实用的PHP防注入类实例
这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注 ...
- php简单实用的操作文件工具类(创建、移动、复制、删除)
php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) { // 原目录,复制到的目录 $dir = opend ...
- 基于Bootstrap简单实用的tags标签插件
http://www.htmleaf.com/jQuery/ jQuery之家 自由分享jQuery.html5和css3的插件库 基于Bootstrap简单实用的tags标签插件
- C#_简单实用的翻页
简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// <summary> /// /// </sum ...
- 简单实用的Windows命令(一)
前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...
- 简单实用的Windows命令(二)
昨天简单的记录了几个非常简单实用的Windows命令,不过我又想起来还有两个我在实际的工作中也是经常用到的命令——PING和IPCONFIG,不过我在工作中的使用都是非常简单的,用PING命令检测对应 ...
- iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信
一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...
随机推荐
- Response.Write,Page.RegisterClientScriptBlock和Page.RegisterStartupScript的区别
Response.Write("<script>");输出在文件头部,一打开就执行. RegisterClientScriptBlock一般返回的是客户端函数的包装, ...
- hdu 单调队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4122 代码: #include<cstdio> #include<iostream& ...
- 找回linux丢失的磁盘空间
最近一台服务器空间总是报警,磁盘空间不足. 使用 df 命令查看,磁盘空间耗用接近 100%,将机器上过期的数据以及日志清理掉,但是空间很快又是接近 100%. 使用 du 查看,想找出磁盘空间被耗用 ...
- 【转】Flask安装
Flask 依赖两个外部库:Werkzeug 和 Jinja2 . Werkzeug 是一个 WSGI(在 Web 应用和多种服务器之间的标准 Python 接口) 工具集.Jinja2 负责渲染模板 ...
- jmeter控制器
1.仅一次控制器 这个控制器可以保证线程在多次循环跑得情况下只登陆一次 2.循环控制器(Loop Controller:设置循环次数 结果: 3. ForEach控制器(ForEach Contro ...
- iptables的实战整理
一.iptables使用场景: 内网情况下使用:在大并发的情况下不要开iptables否则影响性能 二.iptables出现下面的问题: 在yewufa ...
- web开发性能优化---扩展性能篇
1.实现代码分离 一个成熟的软件开发团队一般都不会全然手写代码.这里讲的代码分离仅仅要是开发中用到的小技巧,通过底层框架+手工代码方式结合实现高速开发和高速扩展. Code目录内文件不同意改动,目录主 ...
- oracle3
查看表结构 DESC emp; 查询所有列 SELECT * FROM dept; 切忌动不动就用select * set timing on; 打开显示操作时间的开关,在下面显示查询时间. CREA ...
- Linux命令之ssh
一. 配置ssh 1. 命令 ssh-keygen [选项] 2. 说明 用于为“ssh”生成.管理和转换认证密钥,它支持RSA和DSA两种认证密钥 3. 选项 -C:添加注释 -f:指定用来保存密钥 ...
- js验证邮箱
<html> <head> <script> function verifyAddress(obj) { var email = obj ...