外部表定义#

创建可读外部表或创建可读外部WEB表是在OushuDB中创建一个新的可读外部表定义。可读外部表通常用于快速并行数据加载。一旦定义了外部表,就可以使用SQL命令直接(并行)查询其数据。例如,可以对外部表数据进行查询、关联或排序。也可以为外部表创建视图。不允许对可读外部表执行DML操作(UPDATE、INSERT、DELETE或TRUNCATE)。

创建可写外部表或创建可写外部WEB表是在OushuDB中创建一个新的可写外部表定义。可写外部表通常用于将数据从数据库卸载到一组文件或命名管道中。可写外部web表也可用于将数据输出到可执行程序。一旦定义了可写外部表,就可以从数据库表中选择数据并将其插入可写外部表中。目前只有hdfs协议和hive协议支持TRUNCATE。

在OushuDB中,Web外部表可通过两种方式访问动态数据源:可以在Web服务器上通过http://protocol访问文件表,也可以通过执行操作系统命令或脚本访问数据表。

定义外部表时,需使用 location 子句指定外部数据的位置,使用 format 子句指定外部表文件格式。

LOCATION 子句指定外部数据的位置。location 字符串以协议字符串开头,该字符串指定用于访问数据的存储类型和协议。你可以使用以下协议访问外部表数据源,但不能在一个CREATEA EXTERNAL TABLE命令中混合使用多个协议。

  • gpfdist://protocol指定由一个或多个OushuDB文件服务器gpfdist实例提供服务的数据文件。

  • http://protocol指定一个或多个 http url,并与web表一起使用。

  • hdfs://protocol指定由 hadoop hdfs 文件系统提供服务的数据文件。

  • hive://protocol指定由 Hive 数据库提供服务的数据文件。

备注

不推荐使用file://。相反,请使用gpfdist://、gpfdists://、hive://、hdfs://或COPY命令。

FORMAT子句指定如何格式化外部数据,对于gpfdist协议,有效的平面文件格式(包括HDFS中的文件)是分隔文本(TEXT)格式和逗号分隔值(CSV)格式。 版本3.0增加了对hdfs协议中orc格式的支持。如果文件中的数据不使用默认列分隔符、转义符、空字符串等,则必须指定其他格式选项,以便OushuDB正确读取外部文件中的数据。

备注

OushuDB目前只有hdfs协议和hive协议支持ORC格式。

以下内容是外部表定义的 SQL 命令,包含创建、修改和删除外部表:

创建外部表#

创建一个外部表,使用 CREATE EXTERNAL TABLE命令。在这个命令里,需声明新表名称,各列名称及其数据类型,基于命令的EXECUTE子句或基于URL的LOCATION子句的外部数据来源,数据格式。

当创建一个可读外部表时,location 子句需指定使用一种协议指向外部数据源,format 子句需指定TEXT、CSV、ORC或CUSTOM用户自定义文本格式。比如:使用gpfdist协议在gpfdist目录中找到(.txt)格式的所有文本文件,来创建一个名为ext_customer的可读外部表。这些文件的格式是以‘|’作为列分隔符,空白空间为空。还可以在单行错误隔离模式下访问外部表的SQL定义:

CREATE readable EXTERNAL TABLE ext_customer
   (id int, name text, sponsor text)
   LOCATION ( 'gpfdist://filehost:8081/*.txt' )
   FORMAT 'TEXT' ( DELIMITER '|' NULL ' ')
   LOG ERRORS INTO err_customer SEGMENT REJECT LIMIT 5;

或者创建与上面相同的可读外部表定义,但使用CSV格式文件的示例:

CREATE readable EXTERNAL TABLE ext_customer
   (id int, name text, sponsor text)
   LOCATION ( 'gpfdist://filehost:8081/*.csv' )
   FORMAT 'CSV' ( DELIMITER ',' );

当创建一个可读web外部表时,除location子句方式指定外部数据方式外,还可以使用execute子句运行指定脚本(脚本必须位于所有segment主机上的同一位置)来访问外部数据源。比如:在第五个虚拟节点执行指定脚本创建一个外部表的SQL定义:

CREATE readable EXTERNAL WEB TABLE log_output (
    linenum int,
    message text
)
EXECUTE '/var/load_scripts/get_log_data.sh' ON 5
FORMAT 'TEXT' (DELIMITER '|');

当创建一个可写外部表时,location子句使用上述协议之一指向外部数据源,format子句指定TEXT、CSV、ORC或CUSTOM用户自定义文本格式。例如:以下SQL命令显示如何创建可写hdfs外部表以自由加载、卸载、查询和插入数据:

CREATE  EXTERNAL TABLE tbexternal (
  a int,
  b decimal(10,2),
  t text,
  d date)
LOCATION ('hdfs://host1:port1/tbexternaldir')
FORMAT 'csv' (DELIMITER '|')
LOG ERRORS INTO err_tbexternal SEGMENT REJECT LIMIT 5;

此表支持读取和写入,路径’/tbexternaldir’中的所有文件都可以读取以进行查询或加载,用户还可以通过将数据写入同一路径’/tbexternaldir’来卸载或将数据插入此表。操作此外部表的一些示例如下所示:

INSERT INTO tbexternal SELECT * FROM tb;
INSERT INTO tbexternal SELECT * FROM tb WHERE t like 'test%';
INSERT INTO tb SELECT * FROM tbexternal;
INSERT INTO tb SELECT * FROM tbexternal WHERE t like 'test%';

SELECT a,b FROM tbexternal WHERE b > 10;
SELECT T1.a, T1.d FROM tbexternal T1, tbinternal T2 WHERE T1.t = T2.t;

以下命令显示如何以orc格式创建可写hdfs外部表:

CREATE  EXTERNAL TABLE orcexternal (
      p text,
      q text
)
LOCATION ('hdfs://host1:port1/orcexternaldir')
FORMAT 'ORC' (COMPRESSTYPE 'lz4');

以下命令显示如何以orc格式创建可写hive外部表:

CREATE  EXTERNAL TABLE orcexternal (
  p text,
  q text
)
LOCATION ('hive://host1:port1/dbname/orctablename’)
FORMAT 'ORC' (COMPRESSTYPE 'lz4');

当创建一个可写Web外部表时,使用location子句指定外部数据源或execute子句指定执行脚本,使用format子句指定TEXT、CSV、ORC或CUSTOM用户自己定义的文本格式。例如:创建一个可写的外部web表,该表将segment接收到的输出数据管道化到名为_adreport_etl.sh的可执行脚本:

CREATE  EXTERNAL WEB TABLE campaign_out (LIKE campaign)
EXECUTE '/var/unload_scripts/to_adreport_etl.sh'
FORMAT 'TEXT' (DELIMITER '|');

修改外部表#

修改外部表,使用ALTER TABLE命令。

ALTER TABLE orcexternal RENAME TO orc_ext;
ALTER TABLE orc_ext SET SCHEMA new_schema;

修改外部表结构时,必须使用ALTER EXTERNAL TABLE命令。

增加一个列,使用下面命令:

ALTER EXTERNAL TABLE orc_ext ADD COLUMN col int;

删除一个列,使用下面命令:

ALTER EXTERNAL TABLE orc_ext DROP COLUMN col;

修改列数据类型,使用下面命令:

ALTER EXTERNAL TABLE log_output alter column message TYPE varchar(200);

外部表不支持约束修改、默认值修改。

删除外部表#

删除外部表时,使用DROP EXTERNAL TABLE命令。

DROP EXTERNAL TABLE orc_ext;

使用外部表#

使用外部表的步骤如下:

  • 定义外部表,配置数据库并启动创建外部表时指定的协议。

  • 启动location子句中指定协议对应的文件服务器,且对协议和数据库进行相关配置

  • 将数据文件放置在location子句中对应的位置

  • 使用SQL命令查询使用外部表