博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gpload的简单实用
阅读量:5170 次
发布时间:2019-06-13

本文共 4351 字,大约阅读时间需要 14 分钟。

准备工作:

  1.因为gpload是对gpfdist的封装,因此使用gpload之前必须开启gpfdist的服务,不然无法使用。

gpfdist -d /home/admin -p 8181 -l /tmp/gpfdist.log &

  开启服务的命令这里就不详解,可以参考我之前讲解的gpfdist文档: 

    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.1DATABASE: TestUSER: gpadminHOST: 192.168.23.128PORT: 5432GPLOAD:   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_ipPORT: 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了,不要写太多无用的参数。

 

 

 

  

 

 

 

    

 

转载于:https://www.cnblogs.com/daojiao/p/4595597.html

你可能感兴趣的文章
Apriori算法
查看>>
onlevelwasloaded的调用时机
查看>>
lr_start_transaction/lr_end_transaction事物组合
查看>>
CodeIgniter学习笔记(四)——CI超级对象中的load装载器
查看>>
.NET CLR基本术语
查看>>
ubuntu的home目录下,Desktop等目录消失不见
查看>>
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
C. Tanya and Toys_模拟
查看>>
springboot jar包运行中获取资源文件
查看>>
基于FPGA实现的高速串行交换模块实现方法研究
查看>>