创建外表
当完成创建外部服务器后,在DWS数据库中创建一个OBS外表,用来访问存储在OBS上的数据。OBS外表是只读的,只能用于查询操作,可直接使用SELECT查询其数据。根据集群版本不同,操作有所区别。
- 8.2.0及以上版本:参见管理OBS数据源完成。
- 8.2.0以前版本,参见以下步骤完成。
用户创建外表时如果报错“permission denied for foreign server xxx”,说明当前用户没有外部服务器权限,需要执行以下命令进行授权(obs_server和u1,请替换为实际的外部服务器名称和当前用户名称):
GRANT usage ON foreign server obs_server TO u1;
创建外表
创建外表的语法格式如下。
1 2 3 4 5 6 7 8 9 10 | CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name [ { [CONSTRAINT constraint_name] NULL | [CONSTRAINT constraint_name] NOT NULL | column_constraint [...]} ] | table_constraint [, ...]} [, ...] ] ) SERVER dfs_server OPTIONS ( { option_name ' value ' } [, ...] ) DISTRIBUTE BY {ROUNDROBIN | REPLICATION} [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ; |
例如,创建一个名为“product_info_ext_obs”的外表,对语法中的参数按如表1描述进行设置:
| 参数名 | 描述 | 示例 |
|---|---|---|
| table_name | 外表的表名。 | product_info_ext_obs |
| column_nam | 外表中的字段名。多个字段用“,”隔开。外表的字段个数和字段类型,需要与OBS上保存的数据完全一致。 | product_price |
| type_name | 字段的数据类型。 | integer |
| SERVER dfs_server | 外表的外部服务器名称,这个server必须存在。外表通过设置外部服务器连接OBS读取数据。此处应填写为参照创建外部服务器创建的外部服务器名称。 | obs_server |
| OPTIONS | 用于指定外表数据的各类参数,关键参数如下所示。
| format 'orc' |
| DISTRIBUTE BY | 这个子句是必须的,当前支持ROUNDROBIN和REPLICATION分布方式。缺省为ROUNDROBIN分布方式。 ROUNDROBIN分布方式表示外表在从数据源读取数据时,DWS集群每一个节点随机读取一部分数据,并组成完整数据。 REPLICATION分布方式表示外表在从数据源读取数据时,DWS集群选取一个节点读取全部数据。因为每个数据节点都有完整的表数据。 | ROUNDROBIN |
| 语法中的其他参数 | 其他参数均为可选参数,用户可以根据自己的需求进行设置,在本例中不需要设置。 | - |
根据以上信息,创建外表命令如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | DROP FOREIGN TABLE IF EXISTS product_info_ext_obs; CREATE FOREIGN TABLE product_info_ext_obs ( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER obs_server OPTIONS ( format 'orc', foldername '/mybucket/demo.db/product_info_orc/', encoding 'utf8', totalrows '10' ) DISTRIBUTE BY ROUNDROBIN; |
建立包含分区列的OBS外表,product_info_ext_obs外表使用product_manufacturer字段作为分区键,obs/mybucket/demo.db/product_info_orc/路径下有如下分区目录:
分区目录1:product_manufacturer=10001
分区目录2:product_manufacturer=10010
分区目录3:product_manufacturer=10086
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | DROP FOREIGN TABLE IF EXISTS product_info_ext_obs; CREATE FOREIGN TABLE product_info_ext_obs ( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) , product_manufacturer integer ) SERVER obs_server OPTIONS ( format 'orc', foldername '/mybucket/demo.db/product_info_orc/', encoding 'utf8', totalrows '10' ) DISTRIBUTE BY ROUNDROBIN PARTITION BY (product_manufacturer) AUTOMAPPED; |