格式化输入和输出文件 ---------------------------- 当你使用外部表,COPY或者”oushudb 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做为行分割符: .. code-block:: html :linenos: 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子句,以及”oushudb load”的配置文件。分割符必须出现在两个列之间,但是不要在你的行首和行尾添加分割符。版本2.2.0增加了对非ascii字符(如汉字)和多字符分隔符(如’$$$’, ‘分隔符’)的支持。下面是一个例子: :: data value 1|data value 2|data value 3 下面的例子展示了如何使用 | 做为列分割符: .. code-block:: html :linenos: 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子句)以及”oushudb load”配置文件中,你可以通过声明使用一个符串来表示NULL。 下面的例子展示了如何使用空串’‘做为NULL: .. code-block:: html :linenos: 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文件使用(“)做为转义字符。 下面这个例子显示指定\做为转义字符: .. code-block:: html :linenos: 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子句禁掉转义。例如: .. code-block:: html :linenos: 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特殊的字符。 下表第一列列举了所有支持的字符编码方式。第二列列举了对应的能支持的外部表编码方式。 .. list-table:: :widths: auto :header-rows: 1 :align: left * - 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