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