介绍 GBase 8a 支持的 SQL 语法(中篇)

四 分级查询语句

GBase 8a的 SELECT语句支持使用START WITH...CONNECT BY语句实现 分级查询。

4.1 相关概念

在使用 START WITH...CONNECT BY 语句前,请先了解以下概念。 l 数据源:单物理表、单逻辑表或单个视图。 l 迭代种子:START WITH 指定的过滤条件,基于数据源过滤出来的数 据称为迭代种子,迭代种子都是根节点,如果省略 START WITH,那 么所有数据源都是根节点。 l 迭代关系:CONNECT BY 指定的关联条件,父子节点之间通过迭代关 系进行关联。 l 分级查询:基于迭代种子和数据源,根据迭代关系遍历数据,称为分 级查询,也称树形查询或层次查询。即,基于 START WITH 指定的根 节点和原始表数据,根据 CONNECT BY 指定的关系遍历数据 l 环路:如果一个节点的子孙节点同时又是该节点的祖先节点,称为存 在环路。 l 兄弟间排序:按 KEY 值顺序遍历数据,遍历规则是树的深度优先遍历 中的先序遍历。 l 伪列:伪列并不存储在表中,但是它的行为却类似于表中的字段,可 以基于伪列做查询操作,但不能更新伪列;伪列也可以理解为没有参 数的函数,区别是:基于不同的行,伪列的值一般是不同的。 l 集:某些特定数据集合,如父节点集是指当前层的上层节点数据集合, 子节点集是指当前层的数据集合,祖先节点集是指当前层的所有祖先 节点组成的数据集合。

4.2 执行原理

遍历表中的每条记录,对比是否满足 START WITH 后的条件,如果不满足 则继续下一条,如果满足则以该记录为根节点,然后递归寻找该节点下的子节 点,查找条件是 CONNECT BY 后面指定的条件。

4.3 语法格式

SELECT column_list|[LEVEL] FROM single_table | view [WHERE ...] [hierarchical_clause] [GROUP BY ...] [ORDER [SIBLINGS] BY ...] hierarchical_clause: [START WITH ] CONNECT BY | CONNECT BY [START WITH ] [ORDER SIBLINGS BY {col_name | expr | position} [ASC | DESC] , ...] connect_condition: PRIOR expr1 op expr2 | expr1 op PRIOR expr2 | expr op connect_condition | expr

LEVEL:可选关键字,表示等级。即该节点在树中的层数,根节点为第一 层,level 为 1 CONNECT_BY_ROOT:一元操作符,用于获取结果集中每一条记录对应 根记录的某一列值。参数可以指定多列、表达式或函数。不能出现在 connect_condition 和 join_condition 中。 connect_by_isleaf:伪列,由 GBase 8a 自动维护;用于表示当前层已经是最 后一层。0 表示非最后一层;1 表示最后一层。不能出现在 connect_condition 和 join_conditions 中。 分层查询通过 CONNECT BY 进行递归,若探测到 cycle,GBase 8a 默认会 报错退出;若用户指定 NOCYCLE,GBase 8a 会返回发生 cycle 之前的已查询记 录。 connect_by_iscycle:伪列,由 GBase 8a 自动维护。用于表示当前层是否发 生 cycle。0 表示未发生 cycle;1 表示发生 cycle。只有 NOCYCLE 存在才能使用, 否则报错。 SYS_CONNECT_BY_PATH(column,char):函数,可通过使用指定的字符作 为连接符,将分层查询结果的某一列按照分层路径输出。不能出现在 connect_condition 和 join_conditions 中。 WHERE:根据 CONNECT BY START WITH选择出来的记录进行过滤,是针对单条记录的过滤。 WHERE 条件限制查询返回的行。 hierarchical_clause 中参数说明如下: START WITH :START WITH 表示开始的记录,限定作为搜 索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是 自下而上的搜索则是限定作为叶子节点的条件。 CONNECT BY :这里执行的过滤会把符合条件的记录及其下所有子节点都过滤掉。 CONNECT BY PRIOR 指定与当前记录关联时的字段关系。 START WITH 和 CONNECT BY 的先后顺序不影响查询结果。 ORDER SIBLINGS BY:使用此关键字时可以进行层次查询 connect_condition 中参数说明如下: PRIOR:表示上一条记录。可以指定与当前记录关联时的字段关系。包含 此参数时表示不进行递归查询。

4.4 使用约束

START WITH...CONNECT BY 语句在使用时有以下约束: 1、分级查询只能基于单物理表或单隐式表(derived table)。 以下语句写法错误: SELECT LEVEL FROM t1, t1 t2 WHERE t1.i = t2.i CONNECT BY t1.i =PRIOR t1.j GROUP BY LEVEL ORDER BY LEVEL; 2、CONNECT BY 关联条件不能包含 OR 操作,并且必须包含父子节点间 的等值条件,等号的两边必须是不同的维度(一边包含 PRIOR,一边不包含 PRIOR)。CONNECT BY 后面的 condition 不允许包含 subquery。 以下语句写法正确: SELECT * FROM t1 START WITH i = 1 CONNECT BY LEVEL SELECT * FROM t1 START WITH i = 1 CONNECT BY PRIOR j = i or PRIOR i = j ORDER SIBLINGS BY j; 3、PRIOR 是一元操作符,优先级同正负号,只能用在 CONNECT BY 子句 中;PRIOR 后面不可以接伪列(LEVEL、ROWID 等)、不可以接包含伪列的 表达式、不可以嵌套使用 PRIOR,不可以接聚合函数。 以下语句写法错误: SELECT 1 FROM t1 START WITH i = 1 CONNECT BY j = PRIOR (ROWID+1); SELECT 1 FROM t1 START WITH i = 1 CONNECT BY j = PRIOR LEVEL; SELECT 1 FROM t1 START WITH i = 1 CONNECT BY j = PRIOR SUM(i); SELECT 1 FROM t1 START WITH i = 1 CONNECT BY j = PRIOR (i + PRIOR 1); 4、ORDER SIBLINGS BY 只能用在分级查询语句中,并且不能同聚合同时 存在 以下语句写法错误: SELECT * FROM t1 START WITH i = 1 CONNECT BY PRIOR j = i GROUP BY i,j ORDER SIBLINGS BY j; 5、LEVEL 伪列只能用于分级查询语句中。 以下语句写法错误: SELECT LEVEL FROM t1; 6、不支持实时环路判断,只能保证最终能够检测出环路,如果数据量太大 (如超过十万),会耗时很长才能检测出。 7、最大节点数为 MAX_INT(2147483647) 8、不能基于做过 DLETE 的表进行分级查询,但可以修改为隐式表的形式。DELETE FROM t1 WHERE…; 以下语句写法错误: SELECT … FROM t1 CONNECT BY…; 以下语句写法正确: SELECT … FROM (SELECT * FROM t1) t1 CONNECT BY…; 9、在配置文件“gbase_8a_gbase8a.cnf”中增加参数 gbase_max_allowed_level, 用于控制允许出现的最大 level 数,默认值为 1024,最大 2147483647,最小 1。 10、新增三个保留字:start level prior;

4.5 分级查询语句示例
 

4.5.1 表

建表语句如下: DROP TABLE t1; CREATE TABLE t1(i int, j int, l varchar(10), k double); CREATE TABLE t2 LIKE t1; INSERT INTO t1 VALUES (1,2,'2013-1-2',1.2),(1,5,'2013-1-5',1.5),(1,8,'2013-1-8',1.8); INSERT INTO t1 VALUES (5,3,'2013-5-3',5.3),(5,4,'2013-5-4',5.4); INSERT INTO t1 VALUES (2,7,'2013-2-7',2.7),(2,6,'2013-2-6',2.6); INSERT INTO t1 VALUES (8,9,'2013-8-9',8.9),(8,0,'2013-8-1',8.0);INSERT INTO t1 VALUES (0,10,'2011-1-10',0.1); INSERT INTO t2 SELECT * FROM t1;

4.5.2 视图

视图支持分级查询,即 START WITH...CONNECT BY PRIOR 的使用。

五 查询结果导出语句

GBase 8a 提供了 SELECT ... INTO OUTFILE 语法,可以将数据从数据库中 导出。

5.1 查询结果导出语法

语法格式: SELECT ... INTO OUTFILE 'file_name' [OPTION] FROM ...; SELECT... FROM... INTO OUTFILE 'file_name' [OPTION];参数说明如下: file_name:导出数据保存的路径及文件名,如果导出时,目标文件已经存 在,则系统报告错误信息。OPTION 语法约束: 1、 可指定多个字符为字段分隔符,默认为“\t”。 2、 可指定单个字符为字段包围符,指定多个包围符时报错。支持 OPTIONALLY 选项,加 OPTIONALLY 选项时仅对字符串类型起作用, 否则对所有字段都起作用。默认为无字段包围符。 3、 可指定单个字符为转义标识符,指定多个转义符时报错。 4、 可指定多个字符为换行符,默认为“\n”。 5、 可指定多个字符为行首分隔符,默认为“”。 6、 如果需要同时设置多个 FIELDS/COLUMNS 和 LINES 的参数,则需要 注意的是:所有 FIELDS/COLUMNS 参数的设置都应先于任何 LINES 参数,即 FIELDS/COLUMNS 在前设置,LINES 在后设置,且二者不能相互交叉混合设置; 7、 在一条完整的 SELECT ... INTO OUTFILE 语句中,FIELDS/COLUMNS 或 LINES 保留字仅可出现一次。 SELECT...INTO OUTFILE...支持导出复杂 SQL 语句的查询结果。

5.2 查询结果导出的保存路径及规则

SELECT...FROM TABLE_NAME INTO OUTFILE 主要是让用户能够在服务 主机上快速地导出一张表或部分表(可以设定过滤条件)的内容。如果用户希 望将结果文件建立在其它的主机上,而不是本地 GBase 服务器上,用户就不能 使用 SELECT ... INTO OUTFILE。 导出路径支持如下分类: l 支持相对路径。 l 支持绝对路径。 l ftp/sftp 路径。数据导出路径及文件的使用约束: 1、 导出的文件已存在,系统提示文件已存在; 2、 在导出路径中,如果当前用户不具有创建文件的权限,则系统报错; 3、 指定路径时,如果路径前有空格,此时系统不能自动去掉路径前的空 格,而是按相对路径处理,如果此路径实际不存在,则报错。例如: gbase> SELECT * FROM t INTO OUTFILE ' /tmp/1.txt' FIELDS TERMINATED BY ';'; ERROR 1016 (HY000): Can't open file: 'Can't create/write to file /home/wzx/GBase/userdata/gbase8a/ /tmp/1.txt' (errno: 1093187808)

5.3 定长导出模式
 

定长模式的数据导出方式: 导出时各个字段都按照其字段的最大长度导出,如果该字段数据的实际长 度小于该字段的最大长度,则以空格补齐。 定长模式下的转义符设置: 在定长模式下,需强制指定转义符为空,此时导出的结果是定长且对任何 字符均不转义。

5.4 转义字符导出模式

5.4.1 判定 enclosed 的值是否为 TRUE
 

满足下列判断条件时,enclosed 的值为 TRUE: l 如果该字段是字符串类型,且通过 FIELDS ENCLOSED BY 设定非空 包围符,则 ENCLOSED 的值为 TRUE。 l 如果该字段是非字符串类型,且通过 FIELDS ENCLOSED BY 设定了 非空包围符,在如下两种模式中,ENCLOSED 的值为 TRUE。 Ø 指定空字段分隔符,且对非空包围符加上 OPTIONALLY 关键字, 例如:FIELDS TERMINATED BY '' OPTIONALLY ENCLOSED BY '"'。 Ø 非空包围符不加 OPTIONALLY 关键字,例如:FIELDS ENCLOSED BY '"'。

5.4.2 字符型数据的转义规则

满足下列判断条件之一,则字符 x 需要进行转义: 1、 字符 x 等于转义符首字符, 2、 字符 x 等于行分隔符首字符(FIELDS TERMINATED BY); 3、 字符 x 等于“\0”; 4、 enclosed 的值为 TURE,并且字符 x 等于 FIELDS ENCLOSED BY 设置 的字段包围符首字符; 5、 enclosed 的值为 TURE,并且字符 x 等于 FIELDS TERMINATED BY 设 置的字段分隔符首字符。 说明:enclosed 值的判定规则请参见“4.4.4.1 判定 enclosed 的值是否为 TRUE”。 转义规则的说明: 1、 正常情况下,使用 FIELDS ESCAPED BY 关键字定义的转义符对字符 进行转义; 2、 如果指定 FIELDS ENCLOSED BY 关键字的值为“n、t、r、b、0、Z、 N”之一,并且字符与“字段包围符首字符”相同时,使用字符本身对自己进行 转义。

5.4.3 非字符型数据的转义规则

正常情况下,转义符仅仅对字符型字符进行转义,但是在一些特殊的情况下,对于非字符型字符也可以进行转义。

非字符型字符进行转义的情况: 1、 如果指定“字段包围符首字符”(FIELDS ENCLOSED BY)是特殊字符 “.、0、1、2、3、4、5、6、7、8、9、e、+、-”之一时,才会对非字符型数据 类型进行转义处理。 备注: 指定“字段包围符首字符”为某特殊字符的方式有两种: Ø 直接指定某特殊字符为“字段包围符”的首字符,例如: SELECT * FROM gs INTO OUTFILE '~/1.txt' FIELDS ENCLOSED BY '0'; Ø 指定“字段包围符”为空,且指定“字段分隔符”的首字符为某特殊 字符,例如: SELECT * FROM gs INTO OUTFILE '~/1.txt' FIELDS TERMINATED BY '0' ENCLOSED BY ''; 2、 如果指定“字段包围符首字符”为“ntrb0ZN”之一时,实际上只能为 字符“0”,再进行导出,采用的是用其本身进行转义的方式。

5.4.4 两种不转义的特殊情况

字符型数据不转义的特殊情况: 如果设定字段包围符(FIELDS ENCLOSED BY)为空,导出的字段中的字 符与字段分隔符首字符(FIELDS TERMINATED BY)相同,并且字段分隔符 (FIELDS TERMINATED BY)首字符是“n、t、r、b、0、Z、N”之一。这种 情况下是不对导出的字符进行转义的。非字符型数据不转义的特殊情况: 如果 opt_enclosed 判定为真(判断条件请见说明部分),当导出数据中某字 符与 FIELDS TERMINATED BY 设置的字段分隔符首字符相同,并且字段分隔 符首字符是“.、0、1、2、3、4、5、6、7、8、9、e、+、-”之一时,这种情况下是不对导出的字符进行转义的。 说明: 满足如下判断条件之一时,opt_enclosed为真: TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'; ENCLOSED BY ''; OPTIONALLY ENCLOSED BY ''; 不写 ENCLOSED BY 子句。

5.5 查询结果导出示例

1 几种常见的错误写法 2.不指定字段分隔符  3.指定字段分隔符  4. 指定字段包围符  5. 指定转义标识符  6. 指定换行符  .7 指定行首分隔符  8 指定相对路径保存导出文件

5.6 数据导出中特殊情况的示例
 

5.6.1 数据中含有 NULL 值的处理

 如果待导出数据中某字段的内容为 NULL 值,则该字段导出的 NULL 文本 为“当前转义符 + N”。 默认情况下的转义符为“\”,因此字段导出的 NULL 文本为“\N”。

5.6.2 转义符为空字符的处理  

示例中用到的表及数据: DROP TABLE IF EXISTS gs; CREATE TABLE gs (a int DEFAULT NULL, b varchar(20) DEFAULT NULL); INSERT INTO gs VALUES(NULL,NULL); INSERT INTO gs VALUES(1, 'GBase');

5.6.3 数据中含有“\0”字符的处理
 

5.6.4 指定多字符为字段分隔符,且文本中也包含 多字符分隔符时的处理

5.6.5 字段文本中包含“\n”或“\r”时的处理

  示例中用到的表及数据: DROP TABLE IF EXISTS gs; CREATE TABLE gs (a int DEFAULT NULL, b varchar(20) DEFAULT NULL); INSERT INTO gs values(1,'qw\ner'),(2,'as\rdf'); 如果在导出的数据中某字段(通常为字符串类型,如 varchar)中包含“\n” 或“\r”,则只对“\n”进行转义。 如果在“\n”前加转义字符(默认为“\”),“\r”不变,仍为不可见字符 “\r”,使用二进制方式查看为“0x0D”。

5.6.6 定长模式的导出

5.6.7 含有 NULL 值的定长模式的导出    示例中用到的表及数据: DROP TABLE IF EXISTS gs; CREATE TABLE gs (a int DEFAULT NULL, b varchar(25) DEFAULT NULL); INSERT INTO gs values(NULL,'GBase 8a'),(NULL,NULL); 定长模式对于空值 NULL 的导出:根据字段宽度全部使用空格补齐。

5.6.8 Sftp 导出示例  

 gbase> select * from part into outfile 'sftp://gbase:[email protected]:10022/home/gbase/exppart.tb l' writemode by overwrites; Query OK, 2400000 rows affected (Elapsed: 00:00:09.57) [gbase@rhel73-3 exppart.tbl]$ ll -h 总用量 256M -rw-r--r-- 1 gbase gbase 194M 2 月 8 11:47 exppart.tbl gbase> select * from part into outfile 'sftp://gbase:[email protected]:10022/home/gbase/exppart_fi lesize.tbl' filesize 20M writemode by overwrites; Query OK, 2400000 rows affected (Elapsed: 00:00:11.86) [gbase@rhel73-3 exppart_filesize.tbl]$ ll -h 总用量 304M -rw-r--r-- 1 gbase gbase 14M 2 月 8 11:47 exppart_filesize_p10.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p1.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p2.tbl-rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p3.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p4.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p5.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p6.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p7.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p8.tbl -rw-r--r-- 1 gbase gbase 20M 2 月 8 11:47 exppart_filesize_p9.tbl

5.6.9 filesize 导出示例

 gbase> rmt:select * from part into outfile '/tmp/expaaa.tbl' filesize 20M writemode by overwrites; Query OK, 2400000 rows affected (Elapsed: 00:00:07.85) [root@rhel73-5 tmp]# ll -h | grep expaaa -rw-rw-r-- 1 gbase gbase 14M 2 月 8 11:36 expaaa_p10.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p1.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p2.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p3.tbl-rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p4.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p5.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p6.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p7.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p8.tbl -rw-rw-r-- 1 gbase gbase 20M 2 月 8 11:36 expaaa_p9.tbl

六,批量加载语句

6.1 批量加载语句
 

语法格式: LOAD DATA INFILE 'file_list' INTO TABLE [dbname.]tbl_name [options] options: [DATA_FORMAT number [HAVING LINES SEPARATOR]] [NULL_VALUE 'string'] [FIELDS [TERMINATED BY 'string'] [ENCLOSED BY 'string'] [PRESERVE BLANKS] [AUTOFILL][{LENGTH|DEFINER} 'string'] [TABLE_FIELDS 'string'] ] [LINES [TERMINATED BY 'string'] ] [MAX_BAD_RECORDS number] [DATETIME FORMAT format] [DATE FORMAT format] [TIMESTAMP FORMAT format] [TIME FORMAT format] [TRACE number] [TRACE_PATH 'string'] [PARALLEL number] [FILE_FORMAT format] 参数说明: FILE_LIST:待加载文件列表,或待加载数据文件所在的目录。支持以本地 文件方式和 URL 方式指定数据文件路径,以逗号(',')作为多个文件/目录的分隔 符。可支持本地文件和 FTP/HTTP/HDFS 文件混合加载。 /path, scheme://host:port/path, scheme://host:port/path 支持加载 Amazon S3 数据,支持如下四种 URL 形式: s3n://AWSAccessKeyId:[email protected]/ region/bucket/keys3ns://AWSAccessKeyId:[email protected] /region/bucket/keys3v://AWSAccessKeyId:[email protected] ws.com/region/key s3vs://AWSAccessKeyId:[email protected] aws.com/region/keys3ns://AWSAccessKeyId:[email protected] /region/bucket/key s3v://AWSAccessKeyId:[email protected] ws.com/region/key s3vs://AWSAccessKeyId:[email protected] aws.com/region/key l s3n、s3ns、s3v、s3vs 均为自定义的 S3 协议前缀,不区分大小写, 意义如下: 1) s3n 表示使用 http 协议和路径类型的 URL 访问 S3 服务器终端节点; 2) s3ns 表示使用 https 协议和路径类型的 URL 访问 S3 服务器终端节 点; 3) s3v 表示使用 http 协议和虚拟托管类型的 URL 访问 S3 服务器终端节 点; 4) s3vs 表示使用 https 协议和虚拟托管类型的 URL 访问 S3 服务器终端 节点; l AWSAccessKeyId 为 AWS 账户访问密钥 ID,是由 20 个字符的字母数 字组成的字符串。

6.2 使用约束

6.2.1. 当使用定长加载模式时,必须指定 FIELDS DEFINER 的值。

6.2.2. 当使用文本加载模式时,NULL_VALUE 的默认值为'\N'。

6.2.3. 当使用文本加载方式时,行分隔符默认为'\n'。

6.2.4. 当使用文本加载方式时,如果某列数据可能包含了行分隔符,则需要在 SQL 中输入'HAVING LINES SEPARATOR'子句,同时需要输入入'ENCLOSED BY' 指定字段包围符 

6.2.5. 当在加载文件列表的 URL 中的用户名(user)、密码(password)、主机 名(host)或文件路径(path)中包含下表所列的特殊字符时,对特殊字符 需要用百分号编码代替。 URL:scheme://[user:password@]host[:port]/path

6.2.5.1 Percent-Encoding  pct-encoded = "%" HEXDIG HEXDIG

6.2.5.2 Reserved Characters reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

6.2.5.3. Unreserved Characters unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

6.2.6. 当在加载文件列表的 URL 中的用户名(user)、密码(password)、主机 名(host)或文件路径(path)中包含下表所列的特殊字符时,对特殊字符 需要用转义字符代替。

6.2.7. 宽松模式处理规则与文本方式加载处理规则不一致的有: ü行分隔符、列分隔符、包围符仅支持单字符(单字节),指定多 字符报错; 数据中有空值时,入库数据为 null,不是 default 值,设定 default 值对加载结果没有影响; ü 支持超宽列自动截断; ü数据文件的包围符、列分隔符与设置的不一致,如果第一列为 字符型,数据截断入库,后面的字段都为空值;如果第一列为 数值型,则都为错误数据。 ü 指定 auto_fill_column,在少列的时候自动补齐,无论列定义 是否有 default 值,都会用 null 值补齐缺失列,而不是 default 值。

6.2.8. 针对加载 HDFS 文件支持 NameNode 高可用的情况,在执行加载语句前, 需要首先设置 gbase_hdfs_namenodes='acitve_nn, standby_nn,……',指 定 HDFS 的高可用 NameNode 主机信息。(HDFS 通常由两个及以上的 NameNode 和若干 DataNode 组成,其中一个 NameNode 处于 Active 状态,其他的处于 Standby 状态。)

6.2.9. 多 hadoop 集群并行导入和导出:多套 HDFS 环境需要从集群并行导入导 出时,设置 gbase_hdfs_namenodes 参数为多套 HDFS 的 NameNode 组之间使用 '|'分隔 gbase_hdfs_namenodes='hdfs1_acitve_nn, hdfs1_standby_nn | hdfs2_acitve_nn, hdfs2_standby_nn '

6.3 加载使用示例

6.3.1多数据文件加载 

 指定多个数据源文件,文件可以不在同一个文件服务器,逗号分隔。 gbase> LOAD DATA INFILE '/home/gbase/lineitem.tbl,ftp://192.168.0.1/pub/lineitem.tbl, http://192.168.0.2/lineitem.tbl,hdfs://gbase:[email protected]:50070/lineitem.tbl' INTO TABLE test.lineitem FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\n'; Query OK, 48000000 rows affected Task 1 finished, Loaded 48000000 records, Skipped 0 records

6.3.2使用通配符加载多数据文件

 在加载文件名中使用通配符,可以指定同一目录下的多个文件。在一条加 载语句中可以指定多个包含通配符的文件名。目前支持在文件名中使用*,*.tbl 样式的通配符,在本地文件和 FTP/HTTP/HDFS 协议中均可使用通配符。 支持通配符方式加载的 FTP 服务器,需要其支持 LIST 命令。已测试 vsftpd和 IIS FTP 均满足此要求。 支持通配符方式加载的 HTTP 服务器,需要其响应目录请求。由于不同的 HTTP 服务器对目录请求的响应不同,可能有些 HTTP 服务器不支持以通配符方 式加载数据文件。已测试 Apache HTTP 和 IIS HTTP 均满足此要求。 加载过程: gbase> LOAD DATA INFILE 'ftp://192.168.10.114/data/*' INTO TABLE test.t; Query OK, 100000 rows affected Task 1 finished, Loaded 100000 records, Skipped 0 records 指定包围符、列分隔符、行分隔符加载 部分数据文件: 1|1551894|76910|1|17|33078.94|0.04|0.02|N|O|1996-03-13|1996-02-12|1996-0 3-22|"DELIVER IN PERSON"|TRUCK|egular courts above the| 1|673091|73092|2|36|38306.16|0.09|0.06|N|O|1996-04-12|1996-02-28|1996-04 -20|"TAKE BACK RETURN"|MAIL|ly final dependencies: slyly bold | 加载过程: gbase> LOAD DATA INFILE 'ftp://192.168.0.1/pub/lineitem.tbl' INTO TABLE test.lineitem FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\n'; Query OK, 12000000 rows affected Task 1 finished, Loaded 12000000 records, Skipped 0 records.

6.3.3 指定数据文件中 TIMESTAMP 列的格式

建表语句:create table ttimestamp(a timestamp default '2014-01-01 12:25:36' ,b int); 数据文件: 2014-01-01 12:01:01|1 |2 |3 |4 |5 2014-01-02 12:03:03|6 加载过程: gbase> LOAD DATA INFILE 'http://10.10.120.226/timestamp.txt' INTO TABLE test.ttimestamp DATA_FORMAT 3 FIELDS TERMINATED BY '|' TIMESTAMP FORMAT '%Y-%m-%d %H:%i:%s'; Query OK, 6 rows affected Task 2 finished, Loaded 6 records, Skipped 0 records 查询入库数据: select * from ttimestamp order by b +---------------------+------+ | a | b | +---------------------+------+ | 2014-01-01 12:01:01 | 1 | | 2014-01-01 12:25:36 | 2 | | 2014-01-01 12:25:36 | 3|| 2014-01-01 12:25:36 | 4 | | 2014-01-01 12:25:36 | 5 | | 2014-01-02 12:03:03 | 6 | +---------------------+------+
 

6.3.4 使用 TABLE_FIELDS 指定加载列和日期格式
 

建表语句: create table t (i int, vc varchar(10), dt datetime default '2000-01-01 00:00:01', dt1 datetime default '2000-01-01 00:00:01'); 数据文件: 31589,E,02:02:02 2094-12-13,2082-12-24 01:01:01 16993,jcWaz,02:02:02 2060-10-22,2037-11-17 01:01:01 7584,jubNKAmT,02:02:02 2058-12-24,2066-11-26 01:01:01 8698,iOStkY,02:02:02 2024-11-17,2064-10-25 01:01:01 23256,itWsHqL,02:02:02 2069-10-24,2021-11-19 01:01:01 21932,GelDJbuE,02:02:02 2017-11-26,2075-11-19 01:01:01 4859,Gl,02:02:02 2040-10-16,2051-10-25 01:01:01 11751,InTUcdIM,02:02:02 2048-12-23,2099-10-26 01:01:01 8487,JZ,02:02:02 2026-12-13,2084-11-15 01:01:01 3693,lEKyI,02:02:02 2063-10-21,2026-11-20 01:01:01 加载过程gbase> load data infile 'ftp://192.168.88.141/load_data/table_fields.tbl' into table test.t fields terminated by ',' table_fields 'i, vc, dt date "%H:%i:%s %Y-%m-%d", dt1 date "%Y-%m-%d %H:%i:%s"'; Query OK, 10 rows affected, 0 warnings (Elapsed: 00:00:01.48) Task 1114 finished, Loaded 10 records, Skipped 0 records 查询入库数据: gbase> select * from test.t; +-------+----------+---------------------+---------------------+ | i | vc | dt | dt1 | +-------+----------+---------------------+---------------------+ | 23256 | itWsHqL | 2069-10-24 02:02:02 | 2021-11-19 01:01:01 | | 31589 | E | 2094-12-13 02:02:02 | 2082-12-24 01:01:01 | | 8487 | JZ | 2026-12-13 02:02:02 | 2084-11-15 01:01:01 | | 21932 | GelDJbuE | 2017-11-26 02:02:02 | 2075-11-19 01:01:01 | | 16993 | jcWaz | 2060-10-22 02:02:02 | 2037-11-17 01:01:01 | | 3693 | lEKyI | 2063-10-21 02:02:02 | 2026-11-20 01:01:01 | | 11751 | InTUcdIM | 2048-12-23 02:02:02 | 2099-10-26 01:01:01 | | 8698 | iOStkY | 2024-11-17 02:02:02 | 2064-10-25 01:01:01 | | 4859 | Gl | 2040-10-16 02:02:02 | 2051-10-25 01:01:01 | | 7584 | jubNKAmT | 2058-12-24 02:02:02 | 2066-11-26 01:01:01 | +-------+----------+---------------------+---------------------+ 10 rows in set

6.3.5 使用 AUTOFILL 关键字补齐缺失数据

建表语句: create table t(a int,b varchar(10),c varchar(10)); 数据文件: 1|first 2|second 加载过程: gbase> load data infile 'ftp://192.168.88.141/load_data/autofill.tbl' into table test.t fields terminated by '|' autofill; Query OK, 2 rows affected, 3 warnings (Elapsed: 00:00:00.84) Task 1107 finished, Loaded 2 records, Skipped 0 records 查询入库数据: gbase> select * from t; +------+--------+------+ | a | b | c | +------+--------+------+ | 2 | second | NULL | | 1 | first | NULL | +------+--------+------+ 2 rows in set

6.3.6 定长文本加载

建表语句: create table t (i int, vc varchar(10), c char(10)); 数据文件: 099121413321565086687636597553 587231374843706182211816625391 371909169687901865998438248540 768084517620945445680375033918 521019961269855481454503093679 872098120283548973190459767139 047458772732776053730815273248 749195982779059832391367570454 773781140773581380240166238167 733086147402918352113773075709 加载过程: gbase> load data infile 'ftp://192.168.88.141/load_data/definer.tbl' into table test.t data_format 4 fields length '1,10,10'; Query OK, 10 rows affected Task 1128 finished, Loaded 10 records, Skipped 0 records 查询入库数据: gbase> select * from t;+------+------------+------------+ | i | vc | c | +------+------------+------------+ | 3 | 7190916968 | 7901865998 | | 0 | 4745877273 | 2776053730 | | 0 | 9912141332 | 1565086687 | | 7 | 7378114077 | 3581380240 | | 5 | 8723137484 | 3706182211 | | 7 | 3308614740 | 2918352113 | | 7 | 6808451762 | 0945445680 | | 5 | 2101996126 | 9855481454 | | 8 | 7209812028 | 3548973190 | | 7 | 4919598277 | 9059832391 | +------+------------+------------+ 10 rows in set

おすすめ

転載: blog.csdn.net/weixin_62941622/article/details/121628829