格式化输入和输出文件
本页目录
格式化输入和输出文件#
当你使用外部表或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 |