
# GDS导入示例
#### 示例：多数据服务器并行导入
规划数据服务器与集群处于同一内网，数据服务器IP为192.168.0.90和192.168.0.91。数据源文件格式为CSV。
1. 创建导入的目标表tpcds.reasons。
   ```
   CREATE TABLE tpcds.reasons
   (
     r_reason_sk integer not null,
     r_reason_id char(16) not null,
     r_reason_desc char(100)
   );
   ```
   
2. 以root用户登录每台GDS数据服务器，在两台数据服务器上，分别创建数据文件存放目录"/input_data"。以下以IP为192.168.0.90的数据服务器为例进行操作，剩余服务器上的操作与它一致。
   ```
   mkdir -p /input_data
   ```
   
3. （可选）创建用户及其所属的用户组。此用户用于启动GDS。若该类用户及所属用户组已存在，可跳过此步骤。
   ```
   groupadd gdsgrp
   useradd -g gdsgrp gds_user
   ```
   
4. 将数据源文件均匀分发至相应数据服务器的"/input_data"目录中。
5. 修改每台数据服务器上数据文件及数据文件目录"/input_data"的属主为gds_user。以下以IP为192.168.0.90的数据服务器为例，进行操作。
   ```
   chown -R gds_user:gdsgrp /input_data
   ```
   
6. 以gds_user用户登录每台数据服务器上分别启动GDS。 其中GDS安装路径为"/opt/bin/dws/gds"，数据文件存放在"/input_data/"目录下，数据服务器所在IP为192.168.0.90和192.168.0.91，GDS监听端口为5000，以后台方式运行。
   在IP为192.168.0.90的数据服务器上启动GDS。
   ```
   /opt/bin/dws/gds/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D
   ```
   在IP为192.168.0.91的数据服务器上启动GDS。
   ```
   /opt/bin/dws/gds/gds -d /input_data -p 192.168.0.91:5000 -H 10.10.0.1/24  -D
   ```
   
7. 创建外表tpcds.foreign_tpcds_reasons用于接收数据服务器上的数据。 其中设置**导入模式信息**如下所示：
   - 导入模式为Normal模式。
   
   - 由于启动GDS时，设置的数据源文件存放目录为"/input_data"，GDS监听端口为5000，所以设置参数"location"为"gsfs://192.168.0.90:5000/\* \| gsfs://192.168.0.91:5000/\*"。
   
   
   设置**数据格式信息**是根据导出时设置的详细数据格式参数信息指定的，参数设置如下所示：
   - 数据源文件格式（format）为CSV。
   
   - 编码格式（encoding）为UTF-8。
   
   - 字段分隔符（delimiter）为E'\\x08'。
   
   - 引号字符（quote）为0x1b。
   
   - 数据文件中空值（null）为没有引号的空字符串。
   
   - 逃逸字符（escape）默认和quote相同。
   
   - 数据文件是否包含标题行（header）为默认值false，即导入时数据文件第一行被识别为数据。
   
   
   设置**导入容错性**如下所示：
   - 允许出现的数据格式错误个数（PER NODE REJECT LIMIT 'value'）为unlimited，即接受导入过程中所有数据格式错误。
   
   - 将数据导入过程中出现的数据格式错误信息（LOG INTO error_table_name）写入表err_tpcds_reasons。
   
   
   根据以上信息，创建的外表如下所示：
   ```
   CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons
   (
     r_reason_sk integer not null,
     r_reason_id char(16) not null,
     r_reason_desc char(100)
   )
   SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '', fill_missing_fields 'false') LOG INTO err_tpcds_reasons PER NODE REJECT LIMIT 'unlimited';
   ```
   
8. 通过外表tpcds.foreign_tpcds_reasons，将数据导入目标表tpcds.reasons。
   ```
   INSERT INTO tpcds.reasons SELECT * FROM tpcds.foreign_tpcds_reasons;
   ```
   
9. 查询错误信息表err_tpcds_reasons，处理数据导入错误。详情请参见[处理错误表](https://support.huaweicloud.com/tg-dws/dws_07_0056.html)。
   ```
   SELECT * FROM err_tpcds_reasons;
   ```
   
10. 待数据导入完成后，以gds_user用户登录每台数据服务器，分别停止GDS。
    以下以IP为192.168.0.90的数据服务器为例，停止GDS。其中GDS进程号为128954。
    ```
    ps -ef|grep gds
    gds_user 128954      1  0 15:03 ?        00:00:00 gds -d /input_data -p 192.168.0.90:5000 -D
    gds_user 129003 118723  0 15:04 pts/0    00:00:00 grep gds
    kill -9 128954
    ```
    
 
#### 示例：多线程导入
规划数据服务器与集群处于同一内网，数据服务器IP为192.168.0.90，导入的数据源文件格式为CSV，同时导入2个目标表。
1. 在数据库中创建导入的目标表tpcds.reasons1和tpcds.reasons2。
   ```
   CREATE TABLE tpcds.reasons1
   (
     r_reason_sk integer not null,
     r_reason_id char(16) not null,
     r_reason_desc char(100)
   ) ;
   ```
   ```
   CREATE TABLE tpcds.reasons2
   (
     r_reason_sk integer not null,
     r_reason_id char(16) not null,
     r_reason_desc char(100)
   ) ;
   ```
   
2. 以root用户登录GDS数据服务器，创建数据文件存放目录"/input_data"，以及子目录"/input_data/import1/"和"/input_data/import2/"。
   ```
   mkdir -p /input_data
   ```
   
3. 将目标表tpcds.reasons1的数据源文件存放在数据服务器"/input_data/import1/"目录下，将目标表tpcds.reasons2的数据源文件存放在目录"/input_data/import2/"下。
4. （可选）创建用户及其所属的用户组。此用户用于启动GDS。若该用户及所属用户组已存在，可跳过此步骤。
   ```
   groupadd gdsgrp
   useradd -g gdsgrp gds_user
   ```
   
5. 修改数据服务器上数据文件及数据文件目录"/input_data"的属主为gds_user。
   ```
   chown -R gds_user:gdsgrp /input_data
   ```
   
6. 以gds_user用户登录数据服务器上启动GDS。
   其中GDS安装路径为"/gds"，数据文件存放在"/input_data/"目录下，数据服务器所在IP为192.168.0.90，GDS监听端口为5000，以后台方式运行，设定并发度为2，并设定递归文件目录。
   ```
   /gds/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24  -D -t 2 -r
   ```
   
7. 在数据库中创建外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2用于接收数据服务器上的数据。 以下以外表tpcds.foreign_tpcds_reasons1为例，讲解设置的导入外表参数信息。
   其中设置的**导入模式信息**如下所示：
   - 导入模式为Normal模式。
   
   - 由于启动GDS时，设置的数据源文件存放目录为"/input_data/"，GDS监听端口为5000，实际存放数据源文件目录为"/input_data/import1/"，所以设置参数"location"为"gsfs://192.168.0.90:5000/import1/\*"。
   
   
   设置的**数据格式信息**是根据导出时设置的详细数据格式参数信息指定的，参数设置如下所示：
   - 数据源文件格式（format）为CSV。
   
   - 编码格式（encoding）为UTF-8。
   
   - 字段分隔符（delimiter）为E'\\x08'。
   
   - 引号字符（quote）为0x1b。
   
   - 数据文件中空值（null）为没有引号的空字符串。
   
   - 逃逸字符（escape）默认和quote相同。
   
   - 数据文件是否包含标题行（header）为默认值false，即导入时数据文件第一行被识别为数据。
   
   
   设置的**导入容错性**如下所示：
   - 允许出现的数据格式错误个数（PER NODE REJECT LIMIT 'value'）为unlimited，即接受导入过程中所有数据格式错误。
   
   - 将数据导入过程中出现的数据格式错误信息（LOG INTO error_table_name）写入表err_tpcds_reasons1。
   
   - 当数据源文件中一行的最后一个字段缺失（fill_missing_fields）时，自动设置为NULL。
   
   
   根据以上信息，创建的外表tpcds.foreign_tpcds_reasons1如下所示：
   ```
   CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons1
   (
     r_reason_sk integer not null,
     r_reason_id char(16) not null,
     r_reason_desc char(100)
   ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import1/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons1 PER NODE REJECT LIMIT 'unlimited';
   ```
   参考以上设置，创建的外表tpcds.foreign_tpcds_reasons2如下所示：
   ```
   CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons2
   (
     r_reason_sk integer not null,
     r_reason_id char(16) not null,
     r_reason_desc char(100)
   ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import2/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons2 PER NODE REJECT LIMIT 'unlimited';
   ```
   
8. 通过外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2将数据分别导入tpcds.reasons1和tpcds.reasons2。
   ```
   INSERT INTO tpcds.reasons1 SELECT * FROM tpcds.foreign_tpcds_reasons1;
   ```
   ```
   INSERT INTO tpcds.reasons2 SELECT * FROM tpcds.foreign_tpcds_reasons2;
   ```
   
9. 查询错误信息表err_tpcds_reasons1和err_tpcds_reasons2，处理数据导入错误。详细请参见[处理错误表](https://support.huaweicloud.com/tg-dws/dws_07_0056.html)。
   ```
   SELECT * FROM err_tpcds_reasons1;
   SELECT * FROM err_tpcds_reasons2;
   ```
   
10. 待数据导入完成后，以gds_user用户登录数据服务器，停止GDS。
    其中GDS进程号为128954。
    ```
    ps -ef|grep gds
    gds_user 128954      1  0 15:03 ?        00:00:00 gds -d /input_data -p 192.168.0.90:5000 -D -t 2 -r
    gds_user 129003 118723  0 15:04 pts/0    00:00:00 grep gds
    kill -9 128954
    ```
    
 
