创建GDS外表。
在当前数据库创建一个GDS外表,用于数据并行导入导出。GDS外表分为只读外表和只写外表,分别用于数据并行导入和并行导出,缺省为只读外表。
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name
( [ { column_name type_name POSITION(offset,length) | LIKE source_table } [, ...] ] )
SERVER gsmpp_server
OPTIONS ( { option_name ' value ' } [, ...] )
[ { WRITE ONLY | READ ONLY }]
[ WITH error_table_name | LOG INTO error_table_name]
[REMOTE LOG 'name']
[PER NODE REJECT LIMIT 'value']
[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ];
创建外表语法提供了多个参数,常用参数分类如下。
如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。
外表的表名。
取值范围:字符串,要符合标识符的命名规范。
外表中的字段名。
取值范围:字符串,要符合标识符的命名规范。
字段的数据类型。
在固定长度模式中,定义每一个字段在数据文件中的位置。
说明:offset为该字段在数据源文件中的起始位置,length为该字段的长度。
取值范围:offset取值不能小于0字节,单位为字节。
每条记录的长度不能大于1GB,文件中没有出现的列默认以空值代替。
外表的server名字。对于GDS外表,其server是初始数据库默认创建的,即gsmpp_server。
用于指定外表数据的各类参数。
外表的数据源位置,目前支持URL和本地文件方式的描述。多个URL和多个本地文件都使用‘|’分割。
说明:例如: gsfs://192.168.0.90:5000/*或者file:///data/data.txt或者gsfs:// 192.168.0.90:5000/* | gsfs:// 192.168.0.91:5000/*
外表中数据源文件的格式。
取值范围:CSV、TEXT、FIXED,缺省值为TEXT。
说明:指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。header只能用于CSV,FIXED格式的文件中。
在导入数据时,如果header选项为on,则数据文本第一行会被识别为标题行,会忽略此行。如果header为off,而数据文件中第一行会被识别为数据。
在导出数据时,如果header选项为on,则需要指定▪fileheader。fileheader用来指定导出头文件的格式。如果header为off,则导出数据文件不包含标题行。
取值范围:true/on,false/off。缺省值为false/off。
指定导出数据要包含的标题行定义的文件,文件一般只包含一行用来描述每一列数据信息的字符串。
例如:在包含商品信息的数据前加标题行,定义文件如下
The information of products.\n

指定write only外表导出时,GDS端生成导出数据文件的文件名前缀。

"con","aux","nul","prn","com0","com1","com2","com3","com4","com5","com6","com7","com8","com9","lpt0","lpt1","lpt2","lpt3","lpt4","lpt5","lpt6","lpt7","lpt8","lpt9"
指定数据文件行数据的字段分隔符,不指定则使用默认分隔符,TEXT格式的默认分隔符是水平制表符(tab),CSV格式的默认分隔符为“,”,FIXED格式没有分隔符。
说明:取值范围:
支持多字符分隔符,但分隔符不能超过10个字节。
用于设置将CSV格式数据源文件中的什么字符识别为引号字符。缺省值为双引号。
说明:用来指定CSV格式的数据源文件中,什么字符为逃逸字符。逃逸字符只能指定为单字节字符。
缺省值为双引号。当与quote值相同时,会被替换为'\0'。
说明:取值范围:
TEXT格式下,不对'\'和后面的字符进行转义。
说明:noescaping参数只在TEXT格式下有效。
取值范围:true/on,false/off。缺省值为false/off。
指定数据文件的编码格式名称,即需要以何编码格式对数据文件进行解析和校验/输出文件为何种编码格式。缺省值为当前数据库的默认客户端编码格式,即client_encoding。
导入外表此处强烈建议指定为文件的编码格式,或根据文件的字符集在导入前对client_encoding进行设置。否则可能会导致不必要的解析、校验错误以及其导致的导入报错回滚,甚至非法数据入库。导出外表同样希望指定此选项,以避免导出采用默认字符集设置时与预期不符。
在创建外表时此选项未指定,会在客户端给出对应Warning信息。
说明:目前GDS导入外表不支持解析带有多种字符集编码格式混合的文件,GDS导出外表不支持写出带有多种字符集编码格式混合的文件。
当数据导入时,若数据源文件中一行的最后一个字段缺失的处理方式。
取值范围:true/on,false/off。缺省值为false/off。
missing data for column "tt"ignore_extra_data
若数据源文件比外表定义列数多,是否会忽略对多出的列。该参数只在数据导入过程中使用。
取值范围:true/on,false/off。缺省值为false/off。
extra data after last expected column如果行尾换行符丢失,使两行变成一行时,设置此参数为true将导致后一行数据被忽略掉。
指定本次数据导入允许出现的数据格式错误个数,当导入过程中出现的数据格式错误未达到限定值时,本次数据导入可以成功。

此语法建议用PER NODE REJECT LIMIT 'value'替代。
数据格式错误是指缺少或者多出字段值,数据类型错误或者编码错误。对于非数据格式错误,一旦发生就将导致整个数据导入失败。
取值范围:正整型值、unlimited(无限制)。
缺省值为0,有错误信息立即返回。
说明:指定正整型参数时需要添加单引号。
指定数据导入过程中,数据导入策略。
取值范围:
指定导入导出数据文件换行符样式。
取值范围:支持多字符换行符,但换行符不能超过10个字节。常见的换行符,如\r、\n、\r\n(设成0x0D、0x0A、0x0D0A效果是相同的),其他字符或字符串,如$、#。
说明:指定每一行定长格式数据的长度。按字节计算。此语法仅对READ ONLY的外表有效。
取值范围:N >= POSITION指定的总长度(总长度即为表定义最后一个字段的offset与length的和)AND N < 1GB
指定定长导出中,指定BYTEAOID、CHAROID、NAMEOID、TEXTOID、BPCHAROID、VARCHAROID、NVARCHAR2OID、CSTRINGOID对应类型所在列的对齐方式
取值范围:align_left、align_right
默认值:align_right

由于bytea数据类型要求十六进制格式(如"\XXXX")或八进制格式(如"\XXX\XXX\XXX"),导入时需要左对齐(即列数据以两种格式开头,而非空格)。因此若导出文件需要重新以GDS外表入库且数据长度小于外表formatter指定长度,导出时需要指定左对齐,否则会在入库的过程中报错。
导入对于DATE类型指定格式。此语法仅对READ ONLY的外表有效。
取值范围:合法DATE格式。可参考时间和日期处理函数和操作符。
说明:对于指定为ORACLE兼容类型的数据库,则DATE类型内建为TIMESTAMP类型。在导入的时候,若需指定格式,可以参考下面的timestamp_format参数。
导入对于TIME类型指定格式。此语法仅对READ ONLY的外表有效。
取值范围:合法TIME格式,不支持时区。可参考时间和日期处理函数和操作符。
导入对于TIMESTAMP类型指定格式。此语法仅对READ ONLY的外表有效。
取值范围:合法TIMESTAMP格式,不支持时区。可参考时间和日期处理函数和操作符。
导入对于SMALLDATETIME类型指定格式。此语法仅对READ ONLY的外表有效。
取值范围:合法SMALLDATETIME格式。可参考时间和日期处理函数和操作符。
导入非法字符容错参数。此语法仅对READ ONLY的外表有效。
取值范围:true/on,false/off。缺省值为false/off。
说明:导入非法字符容错规则如下:
(1)对于'\0',容错后转换为空格;
(2)对于其他非法字符,容错后转换为问号;
(3)如果compatible_illegal_chars为true/on标识导入时对于非法字符进行容错处理,如果NULL、DELIMITER、QUOTE、ESCAPE设置为空格或问号则会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数,以避免导入错误。
外表只读,该参数只供数据导入使用。
外表只写。该参数只供数据导出使用。
数据导入过程中出现的数据格式错误信息将被写入error_table_name指定的错误信息表中,可以在并行导入结束后查询此错误信息表,获取详细的错误信息。此参数只在设置了reject_limit参数时有效。
说明:如果为了兼容postgres开源接口,此语法建议用LOG INTO代替。
取值范围:字符串,要符合标识符的命名规范。
数据导入过程中出现的数据格式错误信息将被写入error_table_name指定的错误信息表中,可以在并行导入结束后查询此错误信息表,获取详细的错误信息。
说明:若没有指定PER NODE REJECT LIMIT参数,则此参数不起作用。
取值范围:字符串,要符合标识符的命名规范。
数据导入过程中出现的数据格式错误信息将被写到GDS端以文件方式保存。name为错误数据文件的文件名前缀。
指定本次数据导入过程中每个DN实例上允许出现的数据格式错误的数量,如果有一个DN实例上的错误数量大于设定值,本次导入失败,报错退出。

此语法指定的是单个节点的错误容忍度。
数据格式错误是指缺少或者多出字段值,数据类型错误或者编码错误。对于非数据格式错误,一旦发生就将导致整个数据扫描失败。
取值范围:整型值,unlimited(无限),缺省值为0,有错误信息立即返回。
TO GROUP目前不支持使用。TO NODE主要供内部扩容工具使用,一般用户不应使用。
--建立外表,用来以TEXT格式导入GDS服务器192.168.0.90和192.168.0.91上的数据,导入过程错误信息将记录到err_HR_staffS中。
CREATE FOREIGN TABLE foreign_HR_staffS
(
staff_ID NUMBER(6) ,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EMAIL VARCHAR2(25),
PHONE_NUMBER VARCHAR2(20),
HIRE_DATE DATE,
employment_ID VARCHAR2(10),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(6),
section_ID NUMBER(4)
) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'TEXT', delimiter E'\x08', null '') WITH err_HR_staffS;
--建立外表,用来以TEXT格式导入GDS服务器192.168.0.90和192.168.0.91上的数据,导入过程错误信息将记录到err_HR_staffS中。本次数据导入允许出现的数据格式错误个数为2。
CREATE FOREIGN TABLE foreign_HR_staffS_ft3
(
staff_ID NUMBER(6) ,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EMAIL VARCHAR2(25),
PHONE_NUMBER VARCHAR2(20),
HIRE_DATE DATE,
employment_ID VARCHAR2(10),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(6),
section_ID NUMBER(4)
) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'TEXT', delimiter E'\x08', null '',reject_limit '2') WITH err_HR_staffS_ft3;
--建立外表,用来以CSV格式导入input_data目录下存放在各个节点名文件下的所有文件。
CREATE FOREIGN TABLE foreign_HR_staffS_ft1
(
staff_ID NUMBER(6) ,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EMAIL VARCHAR2(25),
PHONE_NUMBER VARCHAR2(20),
HIRE_DATE DATE,
employment_ID VARCHAR2(10),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(6),
section_ID NUMBER(4)
) SERVER gsmpp_server OPTIONS (location 'file:///input_data/*', format 'csv', mode 'private', delimiter ',') WITH err_HR_staffS_ft1;
--建立外表,用来以CSV格式导出数据到output_data目录下。
CREATE FOREIGN TABLE foreign_HR_staffS_ft2
(
staff_ID NUMBER(6) ,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EMAIL VARCHAR2(25),
PHONE_NUMBER VARCHAR2(20),
HIRE_DATE DATE,
employment_ID VARCHAR2(10),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(6),
section_ID NUMBER(4)
) SERVER gsmpp_server OPTIONS (location 'file:///output_data/', format 'csv', delimiter '|', header 'on') WRITE ONLY;
--删除外表。
DROP FOREIGN TABLE foreign_HR_staffS;
DROP FOREIGN TABLE foreign_HR_staffS_ft1;
DROP FOREIGN TABLE foreign_HR_staffS_ft2;
DROP FOREIGN TABLE foreign_HR_staffS_ft3;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3148471/ ,如需转载,请注明出处,否则将追究法律责任。