格式化输入和输出文件

当你使用外部表,COPY或者”hawq load”来加载数据的时候,数据可以是TEXT格式,也可以是CSV(comma separated values)。外部数据必须有着正确的格式OushuDB才可以理解输入的数据。

行分割符

OushuDB期待行之间由LF(Line feed, 0x0A)字符,CR(Carriage Return, 0xOD),或者CR+LF(0x0D 0x0A)分割。LF是UNIX或者UNIX兼容的操作系统行分割符,Windows或者Mac使用CR或者CR+LF。

下面的例子展示了如何使用CRLF做为行分割符:

1
2
3
CREATE EXTERNAL TABLE ext_table (name text, date date)
LOCATION ('gpfdist://host:port/filename.txt')
FORMAT 'TEXT' (NEWLINE 'CRLF');

列分割符

缺省的TEXT文件列分割符是TAB字符(0x09),CSV文件为逗号(0x2C)。你可以指定分割符使用COPY和CREATE EXTERNAL TABLE的DELIMITER子句,以及”hawq load”的配置文件。分割符必须出现在两个列之间,但是不要在你的行首和行尾添加分割符。版本2.2.0增加了对非ascii字符(如汉字)和多字符分隔符(如’$$$’, ‘分隔符’)的支持。下面是一个例子:

data value 1|data value 2|data value 3

下面的例子展示了如何使用 | 做为列分割符:

1
2
3
CREATE EXTERNAL TABLE ext_table (name text, date date)
LOCATION ('gpfdist://host:port/filename.txt')
FORMAT 'TEXT' (DELIMITER '|');

表示空值

在TEXT格式文件中,默认N表示NULL,CSV格式文件中没有引号的空值表示NULL。在COPY(NULL子句),CREATE EXTERNAL TABLE (NULL子句)以及”hawq load”配置文件中,你可以通过声明使用一个符串来表示NULL。

下面的例子展示了如何使用空串’‘做为NULL:

1
2
3
CREATE EXTERNAL TABLE ext_table (name text, date date)
LOCATION ('gpfdist://host:port/filename.txt')
FORMAT 'TEXT' (NULL '');

转义字符

有两种字符对OushuDB解析TEXT和CSV文件有特殊意义,一个是列的分割符,一个是行的分割符。如果你的数据中包含这些分割符,你需要对其进行转义。默认情况下,对TEXT格式,OushuDB使用(backslash)做为转义字符,而针对CSV文件使用(“)做为转义字符。

下面这个例子显示指定做为转义字符:

1
2
3
CREATE EXTERNAL TABLE ext_table (name text, date date)
LOCATION ('gpfdist://host:port/filename.txt')
FORMAT 'TEXT' (ESCAPE '\');

TEXT格式

下面给出一个例子,假如你有一个表,该表有三个text列。你想加载如下三个值的这个表中:

  • backslash =
  • vertical bar = |
  • exclamation point = !

你的列分割符是| (pipe character),你的转义字符是(backslash),你的输入文件应该像这样:

backslash = \\ | vertical bar = \| | exclamation point = !

你也可是使用转义字符来转义8进制和16进制的序列。转义的值在加载到OushuDB时会被转换成对应的字符。例如,你想加载字符(&),你可以使用16进制(0x26)或者8进制(046)表示。

你也可以通过使用COPY或者CREATE EXTERNAL TABLE中的ESCAPE子句禁掉转义。例如:

1
2
3
CREATE EXTERNAL TABLE ext_table (name text, date date)
LOCATION ('gpfdist://host:port/filename.txt')
FORMAT 'TEXT' (ESCAPE 'OFF');

CSV格式

缺省的CSV格式转义字符为(“),你可以使用ESCAPE子句修改转义字符。

下面给出一个例子,假如你有一个表,该表有三个text列。你想加载如下三个值到这个表中:

  • Free trip to A,B
  • 5.89
  • Special rate “1.79”

你使用的列分割符是,(comma),你使用的转义字符是默认的”(double quote),你的输入文件应该像这样:

"Free trip to A,B","5.89","Special rate ""1.79"""

注意把值放到双引号内部可以保证保留值的开头和结尾处的空格。

文件编码

可以使用CREATE EXTERNAL TABLE的ENCODING子句来指定输入文件的编码:比如’UTF8’。OushuDB支持多种字符编码。

注意:对Microsoft Windows操作系统产生的文件,在导入这些文件的时候,需要使用dos2unix命令来移除Windows特殊的字符。

下表第一列列举了所有支持的字符编码方式。第二列列举了对应的能支持的外部表编码方式。

Server Character Set Available External Table Character Sets
BIG5 not supported as a server encoding
EUC_CN EUC_CN, UTF8
EUC_JP EUC_JP, SJIS, UTF8
EUC_KR EUC_KR, UTF8
EUC_TW EUC_TW, BIG5, UTF8
GB18030 not supported as a server encoding
GBK not supported as a server encoding
ISO_8859_5 ISO_8859_5, KOI8R, UTF8, WIN866, WIN1251
ISO_8859_6 ISO_8859_6, UTF8
ISO_8859_7 ISO_8859_7, UTF8
ISO_8859_8 KOI8R, ISO_8859_5, UTF8, WIN866, WIN1251
KOI8U KOI8U, UTF8
LATIN1 LATIN1, UTF8
LATIN2 LATIN2, UTF8, WIN1250
LATIN3 LATIN3, UTF8
LATIN4 LATIN4, UTF8
LATIN5 LATIN5, UTF8
LATIN6 LATIN6, UTF8
LATIN7 LATIN7, UTF8
LATIN8 LATIN8, UTF8
LATIN9 LATIN9, UTF8
LATIN10 LATIN10, UTF8
SJIS not supported as a server encoding
SQL_ASCII any (no conversion will be performed)
UHC not supported as a server encoding
UTF8 all supported encodings
WIN866 WIN866, ISO_8859_5, KOI8R, UTF8, WIN1251
WIN874 WIN874, UTF8
WIN1250 WIN1250, LATIN2, UTF8
WIN1251 WIN1251, ISO_8859_5, KOI8R, UTF8, WIN866
WIN1252 WIN1252, UTF8
WIN1253 WIN1253, UTF8
WIN1254 WIN1254, UTF8
WIN1255 WIN1255, UTF8
WIN1256 WIN1256, UTF8
WIN1257 WIN1257, UTF8
WIN1258 WIN1258, UTF8