
# CREATE EXTERNAL SCHEMA
#### 功能描述
创建EXTERNAL SCHEMA，即外部模式。该语法仅8.3.0及以上版本支持。
使用CREATE EXTERNAL SCHEMA建立DWS集群与外部数据源（如Lakeformation、DLI、Hive Metastore）的元数据映射通道，实时高效访问外部数据源。用户通过"外部模式名.表名" 直接查询，无需手动创建外表或数据搬迁，显著跨源数据访问与分析。
#### 注意事项
- 具有当前数据库CREATE权限的用户可创建外部SCHEMA。
- 创建命名对象时不可用EXTERNAL SCHEMA作为前缀修饰，即不支持在EXTERNAL SCHEMA下创建对象。
- CREATE EXTERNAL SCHEMA不支持在新模式中创建对象的子命令。
 
#### 语法格式
创建EXTERNAL SCHEMA。
```
CREATE EXTERNAL SCHEMA schema_name 
    WITH SOURCE source_name
         DATABASE 'database_name'
         SERVER server_name
         [ CATALOG 'catalog_name' ]
         [ OPTIONS ( { option_name ' value ' } [, ...] ) ]
         [METAADDRESS 'address']
         [CONFIGURATION 'confpath'];
```
#### 参数说明
表1CREATE EXTERNAL SCHEMA参数说明 
| 参数            | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 取值范围                                                                                                                                                                                  |
|:---|:---|:---|
| schema_name   | 外部模式名称。 - 模式名不能和当前数据库里其他的模式重名。  - 模式的名称不能以"pg_"开头。   | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0007.html#ZH-CN_TOPIC_0000002202094021__section1475018612353)。                                           |
| SOURCE        | 外部元数据存储引擎的类型。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 当前仅支持dli，lakeformation，hive。                                                                                                                                                          |
| DATABASE      | 指定外部SCHEMA所对应的要访问的数据库。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | -                                                                                                                                                                                     |
| SERVER        | 外部SCHEMA关联的外部服务器名称，关联后可访问到外部数据。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 支持关联type类型为lf、obs、dli或hdfs的Server。详情可参见[CREATE SERVER](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0175.html)。其中lf类型的Server，请参见《数据仓库服务用户指南》的"管理LakeFormation数据源"进行创建。 |
| CATALOG       | Lakeformation中对应的要访问的目录名称，当Server的type为lf时需要指定catalog，否则不需要指定。                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | -                                                                                                                                                                                     |
| OPTIONS       | 用于指定外表数据的各类参数，当前支持的参数类型如右列所示。该参数仅8.3.0及以上版本支持。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | dli_project_id：DLI服务对应的项目编号，可在管理控制台上获取项目ID，该参数仅支持type类型为dli的Server。                                                                                                                   |
| METAADDRESS   | 表示Hive Metastore通讯接口。该参数仅9.1.0及以上版本支持。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | -                                                                                                                                                                                     |
| CONFIGURATION | 表示Hive Metastore相关配置文件存放路径。该参数仅9.1.0及以上版本支持。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 如果当前搜索路径上的模式中存在同名对象时，需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。                                                                                                             |
   
#### 示例：通过external schema读取Lakeformation表
通过external schema读取Lakeformation表的方式如下：
1. 创建lf_server，对应的foreign data wrapper为DFS_FDW。
   ![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
   如何创建lf_server请参见《数据仓库服务用户指南》中"管理LakeFormation数据源"章节。
   
2. 创建external schema。
   ```
   CREATE EXTERNAL SCHEMA ex_lf
       WITH SOURCE lakeformation
            DATABASE 'demo'
            SERVER lf_server
            CATALOG 'hive';
   ```
   - SOURCE为lakeformation。
   
   - 表关联的DLI服务器为lf_server。
   
   - DATABASE为对应的Lakeformation数据库。
   
   - CATALOG为对应要访问的Lakeformation的目录名称，根据实际替换。
    
3. 角色授权。
   1. 查询当前用户。
      ```
      SELECT current_user;
      ```
      
   
   2. Lakeformation管控面创建与当前同名角色并对要访问的表授权。
    
4. 通过external schema查询Lakeformation表的数据，test_lf为要访问的Lakeformation表。
   ```
   SELECT COUNT(*) FROM ex_dli.test_lf;
    count 
   -------
       20
   (1 row)
   ```
   
 
#### 通过external schema读取Hive Metastore表
通过external schema读取Hive Metastore表。仅9.1.0及以上集群版本支持。
1. 创建obs/hdfs server，对应的foreign data wrapper为DFS_FDW。
   ```
   CREATE SERVER hdfs_server 
   FOREIGN DATA WRAPPER HDFS_FDW 
   OPTIONS (
   address '***.***.***.***:9000', 
   type'HDFS');
   CREATE SERVER obs_server 
   FOREIGN DATA WRAPPER dfs_fdw 
   OPTIONS ( 
       address 'obs.cn-north-1.myhuaweicloud.com' ,     ACCESS_KEY 'access_key_value_to_be_replaced', 
       SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced', 
       encrypt 'on',
       type 'obs' );
   ```
   
2. 手动创建external schema对接Hive Metastore时，用户需先准备好相关配置文件，具体如下：
   1. 从集群管理页面或hive安装目录获取hive-site.xml、hivemetastore-site.xml这两个配置文件，上传至CONFIGURATION目录。
   
   2. 新增elk-site.xml配置文件并添加配置项（或在原有的elk-site.xml配置文件中新增），需要根据实际替换用户名、域名、keytab文件名等信息。
      ```
      <property>
                      <name>hive.kerberos.principal</name>
                      <value>user/hadoop.hadoop.com@HADOOP.COM</value> //连接Hadoop的用户@域名
              </property>
              <property>
                      <name>hive.kerberos.keytab</name>
                      <value>{配置目录}/user.keytab</value> //连接Hadoop用户的keytab文件的绝对路径
              </property>
      ```
      
    
3. 创建external schema。
   ```
   CREATE EXTERNAL SCHEMA ex_hms 
       WITH SOURCE source_type
       DATABASE 'db_name'
       SERVER srv_name
       METAADDRESS 'address'
       CONFIGURATION 'confpath';
   ```
   - SOURCE为hive。
   
   - SERVER为表关联的服务器obs/hdfs server。
   
   - DATABASE为对应的HMS数据库。
   
   - METAADDRESS为Hive Metastore通讯接口。
   
   - CONFIGURATION是一个绝对路径，表示Hive Metastore相关配置文件存放路径，根据实际替换。
    
4. 通过external schema查询HMS表的数据，test_hms为要访问的HMS表，根据实际替换。
   ```
   SELECT COUNT(*) FROM ex_hms.test_hms;
    count 
   -------
       20
   (1 row)
   ```
   
 
#### 相关链接
[ALTER EXTERNAL SCHEMA](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0366.html#ZH-CN_TOPIC_0000002255113305)
#### 使用实践
[使用EXTERNAL SCHEMA跨集群访问HiveMetaStore元数据](https://support.huaweicloud.com/bestpractice-dws/dws_05_0013.html)
