1 數據類型對比
MySQL | PostgreSQL | comments | |
數值類型 | TINYINT | SMALLINT | gp中無zerofill屬性及unsigned類型,因此爲了數據不越界需使用大一精度的數據類型匹配 |
SMALLINT | SMALLINT | ||
MEDIUMINT | INTEGER | ||
INT|INTEGER | INTEGER | ||
BIGINT | BIGINT | ||
TINYINT UNSIGNED | SMALLINT | ||
SMALLINT UNSIGNED | INTEGER | ||
MEDIUMINT UNSIGNED | INTEGER | ||
INT UNSIGNED | BIGINT | ||
BIGINT UNSIGNED | NUMERIC(20) | ||
BIT | BIT | ||
FLOAT | REAL | ||
FLOAT UNSIGNED | DOUBLE PRECISION | ||
DOUBLE|REAL|DOUBLE PRECISION | DOUBLE PRECISION | ||
DECIMAL|DEC|NUMERIC|FIXED | NUMERIC | ||
字符類型 | CHAR | CHARACTER|CHAR | |
VARCHAR | CHARACTER VARYING|VARCHAR | ||
TINYTEXT | TEXT | ||
TEXT | TEXT | ||
MEDIUMTEXT | TEXT | ||
LONGTEXT | TEXT | ||
BINARY|CHAR BYTE | BYTEA | ||
VARBINARY | BYTEA | ||
TINYBLOB | BYTEA | ||
BLOB | BYTEA | ||
MEDIUMBLOB | BYTEA | ||
LONGBLOB | BYTEA | ||
時間類型 | DATE | DATE | |
TIME | TIME | ||
YEAR | 無 | ||
DATETIME | TIMESTAMP | ||
TIMESTAMP | TIMESTAMP | ||
其餘類型 | BOOL|BOOLEAN | BOOLEAN | |
ENUM | CREATE TYPE … AS ENUM | ||
SET | 無 |
2 語法對比
2.1 limit
MySQL:函數
LIMIT offset, limit
orspa
LIMIT limit OFFSET offset
Greenplum:日誌
LIMIT limit OFFSET offset
2.2 replace
MySQL:code
REPLACE [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
Greenplum:orm
不支持該語法,須要使用函數實現,例:blog
CREATE FUNCTION replace() RETURNS void AS $$ BEGIN IF EXISTS( SELECT * FROM phonebook WHERE name = 'john doe' ) THEN UPDATE phonebook SET extension = '1234' WHERE name = 'john doe'; ELSE INSERT INTO phonebook VALUES( 'john doe', '1234' ); END IF; RETURN; END; $$ LANGUAGE plpgsql;
2.3 insert into … on duplicate key update
MySQL:seo
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ]
Greenplum:rem
不支持該語法,須要使用函數實現,例:字符串
CREATE FUNCTION replace() RETURNS void AS $$ BEGIN IF EXISTS( SELECT * FROM phonebook WHERE name = 'john doe' ) THEN UPDATE phonebook SET extension = '1234' WHERE name = 'john doe'; ELSE INSERT INTO phonebook VALUES( 'john doe', '1234' ); END IF; RETURN; END; $$ LANGUAGE plpgsql;
2.4 select … into outfile
MySQL:
SELECT ... INTO OUTFILE 'path/file_name'
Greenplum:
COPY ( SELECT ... ) TO 'path/file_name'
2.5 自增列
MySQL:
列加auto_increment屬性,例:create table a(id int auto_increment primary key)
獲取當前值:select last_insert_id()
Greenplum:
字段類型使用serial,例:create table a(id serial primary key)
獲取當前值:select currval(‘a_id_seq’)
2.6 註釋
MySQL:
使用#或–
Greenplum:
使用–
2.7 執行存儲過程
MySQL:
call proc_name()
Greenplum:
Greenplum並沒有存儲過程,使用函數代替,因此執行:
select proc_name()
3 經常使用函數對比
3.1 時間函數
3.1.1 時間轉字符串
MySQL:date_format()
例:select date_format(now(),’%Y%m%d%H%i%s’)
Greenplum:to_char()
例:select to_char(now(), ‘YYYYMMDDHH24MISS’)
3.1.2 字符串轉時間
MySQL:str_to_date()
例:select str_to_date(‘20171120′,’%Y%m%d%H%i%s’)
Greenplum:to_date(),to_timestamp()
例:select to_date(‘20171120’, ‘YYYYMMDD’)
select to_date(‘20171120’, ‘YYYYMMDDHH24MISS’)
3.1.3 時間計算
MySQL:date_add()
例:select date_add(now(), interval 2 day)
Greenplum:直接計算
例:select now() + interval ‘2 day’
3.2 字符函數
3.2.1 空字符串處理
MySQL:ifnull
例:select ifnull(null,‘default’)
Greenplum:coalesce
例:select coalesce(null,‘default’)
3.2.2 字符串拼接
MySQL:concat()
例:select concat(‘abc’,‘def’)
Greenplum:||
例:select ‘abc’||’def’
4 數據遷移
Greenplum數據導入3種方式:
4.1 COPY命令
COPY須要通過master,僅建議在小數據量時使用。沒法並行導入,在大量數據導入時效率很低,不過多介紹。
例:COPY tablea FROM ‘/data/tablea_data’;
4.2 使用外部表
外部表以及4.3中的gpload都須要使用gpfdist服務。
gpfdist是Greenplum自帶的一個並行文件服務,原理以下圖:
gpfdist爲每一個segment提供並行讀寫數據文件的服務。
一、先啓動gpfdist服務,例:
gpfdist -d /data0/data -p 8123 -l /home/greenplum/gpfdist.log &
-d 指定數據目錄 -p指定服務端口 -l 指定日誌文件
將數據文件放入該目錄下
二、建立外部表,例:
create external table lzk.a(a int,b varchar(50)) location (‘gpfdist:localhost:8123/a.txt’) fromat ‘text’(delimiter ‘,’)
從外部表導入數據,例:
create table t as select * from a;
或者先建立,後導入:
create table t (a int,b varchar(50)) distributed by (a); insert into t select * from a;
4.3 gpload
經過配置yaml控制文件來進行數據導入,一樣
依賴gpfdist服務。
例:
一、編輯a.yml文件
VERSION: 1.0.0.1 DATABASE: lzk USER: greenplum HOST: localhost PORT: 5432 GPLOAD: INPUT: - SOURCE: LOCAL_HOSTNAME: - localhost PORT: 8234 FILE: - /data0/data/a.txt - COLUMNS: - a: integer - b: text - FORMAT: text - DELIMITER: ',' - ERROR_LIMIT: 25 - LOG_ERRORS: true OUTPUT: - TABLE: public.a - MODE: INSERT
二、進行導入:
gpload -f a.yml -l a.log