格式化输入和输出文件#

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

行分割符#

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

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

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子句指定分割符。分割符必须出现在两个列之间,但是不要在你的行首和行尾添加分割符。版本2.2.0增加了对非ascii字符(如汉字)和多字符分隔符(如’$$$’, ‘分隔符’)的支持。

下面是一个例子:

data value 1|data value 2|data value 3

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

CREATE readable 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子句)中,你可以通过声明使用一个符串来表示NULL。

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

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文件使用(“)做为转义字符。

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

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子句禁掉转义。例如:

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 支持多种字符编码(ORC格式文件仅支持UTF8)。

注意:对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