云数据库 GAUSSDB-示例1:Normal策略导入:示例:多线程导入

时间:2024-01-23 20:09:21

示例:多线程导入

规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导入的数据源文件格式为CSV,同时导入2个目标表。

  1. 在数据库中创建导入的目标表tpcds.reasons1和tpcds.reasons2。
    1
    2
    3
    4
    5
    6
    postgres=# CREATE TABLE tpcds.reasons1
    (
      r_reason_sk integer not null,
      r_reason_id char(16) not null,
      r_reason_desc char(100)
    ) ;
    
    1
    2
    3
    4
    5
    6
    postgres=# CREATE TABLE tpcds.reasons2
    (
      r_reason_sk integer not null,
      r_reason_id char(16) not null,
      r_reason_desc char(100)
    ) ;
    
  2. (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该用户及所属用户组已存在,可跳过此步骤。
    groupadd gdsgrp
    useradd -g gdsgrp gds_user
  3. 切换用户gds_user,登录GDS数据服务器,创建数据文件存放目录“/input_data”,以及子目录“/input_data/import1/”和“/input_data/import2/”。
    su - gds_user
    mkdir -p /input_data
  4. 将目标表tpcds.reasons1的数据源文件存放在数据服务器“/input_data/import1/”目录下,将目标表tpcds.reasons2的数据源文件存放在目录“/input_data/import2/”下。
  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)为默认值双引号。
    • 数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。

    设置的导入容错性如下所示:

    • 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。
    • 将数据导入过程中出现的数据格式错误信息(LOG INTO error_table_name)写入表err_tpcds_reasons1。
    • 当数据源文件中一行的最后一个字段缺失(fill_missing_fields)时,自动设置为NULL。

    根据以上信息,创建的外表tpcds.foreign_tpcds_reasons1如下所示:

    1
    2
    3
    4
    5
    6
    postgres=# 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如下所示:

    1
    2
    3
    4
    5
    6
    postgres=# 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。
    1
    postgres=# INSERT INTO tpcds.reasons1 SELECT * FROM tpcds.foreign_tpcds_reasons1;
    
    1
    postgres=# INSERT INTO tpcds.reasons2 SELECT * FROM tpcds.foreign_tpcds_reasons2;
    
  9. 查询错误信息表err_tpcds_reasons1和err_tpcds_reasons2,处理数据导入错误。详细请参见处理错误表
    1
    2
    postgres=# SELECT * FROM err_tpcds_reasons1;
    postgres=# 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
support.huaweicloud.com/devg-v1-gaussdb/gaussdb_devg_0196.html