
# 示例
#### 单表导出操作步骤
通过创建外表，将数据库中的单表导出至OBS的两个桶中。
1. 用户登录OBS管理控制台。在OBS桶页面，分别创建数据文件存放的两个桶"/input-data1""/input-data2"，并创建每个桶下面的data目录"/input-data1/data""/input-data2/data"。
2. 在DWS数据库上，创建外表tpcds.customer_address_ext1和tpcds.customer_address_ext2用于OBS数据服务器接收数据库导出数据。 
   OBS与集群处于同一区域，需要导出的表为DWS示例表tpcds.customer_address。
   其中设置的**导出信息**如下所示：
   - 由于OBS数据服务器上的数据源文件存放目录为"/input-data1/data/ "和"/input-data2/data/" ，所以设置tpcds.customer_address_ext1参数"location"为"obs://input-data1/data/"，设置tpcds.customer_address_ext2参数"location"为" obs://input-data2/data/"。
   
   
   设置的**数据格式信息**是根据表从数据库导出时需要的详细数据格式参数信息指定的，参数设置如下所示：
   - 数据源文件格式（format）为"CSV"。
   
   - 编码格式（encoding）为"UTF-8"。
   
   - 字段分隔符（delimiter）为"E'\\x08'"。
   
   - 是否使用加密（encrypt），默认为"off"。
   
   - （必选）用户获取OBS访问协议对应的AK值（access_key ）。
   
   - （必选）用户获取OBS访问协议对应的SK值（secret_access_key）。
     ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
     用户在创建用户时已经获取了access_key和secret_access_key的密钥，请根据实际密钥替换示例中的内容。
     
   
   
   根据以上信息，创建的外表如下所示：
   ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/notice_3.0-zh-cn.png)
   认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
   ```
   CREATE FOREIGN TABLE tpcds.customer_address_ext1
   (
   ca_address_sk             integer                       ,
   ca_address_id             char(16)                      ,
   ca_street_number          char(10)                      ,
   ca_street_name            varchar(60)                   ,
   ca_street_type            char(15)                      ,
   ca_suite_number           char(10)                      ,
   ca_city                   varchar(60)                   ,
   ca_county                 varchar(30)                   ,
   ca_state                  char(2)                       ,
   ca_zip                    char(10)                      ,
   ca_country                varchar(20)                   ,
   ca_gmt_offset             decimal(5,2)                  ,
   ca_location_type          char(20)
   )
   SERVER gsmpp_server
   OPTIONS(LOCATION 'obs://input-data1/data/',
   FORMAT 'CSV',
   ENCODING 'utf8', 
   DELIMITER E'\x08', 
   ENCRYPT 'off',
   ACCESS_KEY 'access_key_value_to_be_replaced',
   SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' 
   )Write Only;
   ```
   ```
   CREATE FOREIGN TABLE tpcds.customer_address_ext2
   (
   ca_address_sk             integer                       ,
   ca_address_id             char(16)                      ,
   ca_street_number          char(10)                      ,
   ca_street_name            varchar(60)                   ,
   ca_street_type            char(15)                      ,
   ca_suite_number           char(10)                      ,
   ca_city                   varchar(60)                   ,
   ca_county                 varchar(30)                   ,
   ca_state                  char(2)                       ,
   ca_zip                    char(10)                      ,
   ca_country                varchar(20)                   ,
   ca_gmt_offset             decimal(5,2)                  ,
   ca_location_type          char(20)
   )
   SERVER gsmpp_server
   OPTIONS(LOCATION 'obs://input-data2/data/',
   FORMAT 'CSV',
   ENCODING 'utf8', 
   DELIMITER E'\x08', 
   ENCRYPT 'off',
   ACCESS_KEY 'access_key_value_to_be_replaced',
   SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced'
   )Write Only;
   ```
   
   
3. 在DWS数据库上，将数据表tpcds.customer_address并发导出到外表tpcds.customer_address_ext1和tpcds.customer_address_ext2中。 
   ```
   INSERT INTO tpcds.customer_address_ext1 SELECT * FROM tpcds.customer_address;
   ```
   ```
   INSERT INTO tpcds.customer_address_ext2 SELECT * FROM tpcds.customer_address;
   ```
   ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
   OBS外表在设计上禁止往非空的路径下导出文件，但是在并发场景下会出现同一路径导出文件的情况，此时会发生异常。
   异常场景：假如用户使用同一张表的数据并发导出到同一个OBS的外表，在一条SQL语句执行在OBS服务器上没有生成文件时，另一条SQL语句也执行导出，最终执行结果为两条SQL语句均执行成功，产生数据覆盖现象，建议用户在执行OBS外表导出任务时，不要往同一OBS外表并发导出。
   
   
 
#### 多表并发导出操作步骤
通过创建的两个外表，将数据库中的两个表分别导出至OBS的桶中。
1. 用户登录OBS管理控制台。在OBS桶页面，分别创建数据文件存放的两个桶"/input-data1""/input-data2"，并创建每个桶下面的data目录"/input-data1/data""/input-data2/data"。
2. 在DWS数据库上，创建外表tpcds.customer_address_ext1和tpcds.customer_address_ext2分别用于OBS服务器接收导出的数据。 
   规划OBS与集群处于同一区域，需要导出的表为已存在的表tpcds.customer_address和tpcds.customer_demographics。
   其中设置的**导出信息** 如下所示：
   - 由于OBS服务器上的数据源文件存放目录为"/input-data1/data/ "和"/input-data2/data/" ，所以设置tpcds.customer_address_ext1参数"location"为"obs://input-data1/data/"，设置tpcds.customer_address_ext2参数"location"为" obs://input-data2/data/"。
    
   设置的**数据格式信息**是根据表从DWS中导出时需要的详细数据格式参数信息指定的，参数设置如下所示：
   - 数据源文件格式（format）为"CSV"。
   
   - 编码格式（encoding）为"UTF-8"。
   
   - 字段分隔符（delimiter）为"E'\\x08'"。
   
   - 是否使用加密（encrypt），默认为"off"。
   
   - （必选）用户获取OBS访问协议对应的AK值（access_key ）。
   
   - （必选）用户获取OBS访问协议对应的SK值（secret_access_key）。
     ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
     用户在创建用户时已经获取了access_key和secret_access_key的密钥，请根据实际密钥替换示例中的内容。
     
   
   
   根据以上信息，创建的外表如下所示：
   ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/notice_3.0-zh-cn.png)
   认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
   ```
   CREATE FOREIGN TABLE tpcds.customer_address_ext1
   (
   ca_address_sk             integer               ,
   ca_address_id             char(16)              ,
   ca_street_number          char(10)                      ,
   ca_street_name            varchar(60)                   ,
   ca_street_type            char(15)                      ,
   ca_suite_number           char(10)                      ,
   ca_city                   varchar(60)                   ,
   ca_county                 varchar(30)                   ,
   ca_state                  char(2)                       ,
   ca_zip                    char(10)                      ,
   ca_country                varchar(20)                   ,
   ca_gmt_offset             decimal(5,2)                  ,
   ca_location_type          char(20)
   )
   SERVER gsmpp_server
   OPTIONS(LOCATION 'obs://input-data1/data/',
   FORMAT 'CSV',
   ENCODING 'utf8', 
   DELIMITER E'\x08',
   ENCRYPT 'off',
   ACCESS_KEY 'access_key_value_to_be_replaced',
   SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' 
   )Write Only;
   ```
   ```
   CREATE FOREIGN TABLE tpcds.customer_address_ext2
   (
   ca_address_sk             integer               ,
   ca_address_id             char(16)              ,
   ca_address_name           varchar(20)           ,
   ca_address_code           integer               ,
   ca_street_number          char(10)                      ,
   ca_street_name            varchar(60)                   ,
   ca_street_type            char(15)                      ,
   ca_suite_number           char(10)                      ,
   ca_city                   varchar(60)                   ,
   ca_county                 varchar(30)                   ,
   ca_state                  char(2)                       ,
   ca_zip                    char(10)                      ,
   ca_country                varchar(20)                   ,
   ca_gmt_offset             decimal(5,2)                  
   )
   SERVER gsmpp_server
   OPTIONS(LOCATION 'obs://input_data2/data/',
   FORMAT 'CSV',
   ENCODING 'utf8', 
   DELIMITER E'\x08', 
   QUOTE E'\x1b',
   ENCRYPT 'off',
   ACCESS_KEY 'access_key_value_to_be_replaced',
   SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced'
   )Write Only;
   ```
   
   
3. 在DWS数据库上，将数据表tpcds.customer_address和tpcds.warehouse并发导出到外表tpcds.customer_address_ext1和tpcds.customer_address_ext2中。 
   ```
   INSERT INTO tpcds.customer_address_ext1 SELECT * FROM tpcds.customer_address;
   ```
   ```
   INSERT INTO tpcds.customer_address_ext2 SELECT * FROM tpcds.warehouse;
   ```
   
   
 
