更新时间:2024-11-05 GMT+08:00

OBS导入数据示例

  1. GaussDB(DWS)上,创建导入的目标表tpcds.customer_address。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE TABLE tpcds.customer_address
    (
        ca_address_sk             integer               not null,
        ca_address_id             char(16)              not null,
        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)
    )
    WITH (orientation = column,compression=middle)
    DISTRIBUTE BY hash (ca_address_sk);
    

  2. 用户通过管理控制台登录到OBS数据服务器。在OBS数据服务器上,分别创建数据文件存放的两个桶“/input-data1”和“/input-data2”,并创建每个桶下面的data目录“/input-data1/data”和“/input-data2/data”。
  3. 将数据源文件均匀上传至OBS数据服务器的“/input-data1/data/”和“/input-data2/data/”目录中。
  4. GaussDB(DWS)上,创建外表tpcds.customer_address_ext用于接收数据服务器上的数据。

    假设OBS数据服务器与集群网络连接正常,OBS数据服务器IP为xxx.xxx.x.xx,数据源文件格式为CSV,规划的并行导入与示例保持一致。

    其中设置的导入信息如下所示:

    • 由于OBS服务器上的数据源文件存放目录为“/input-data1/data/ ”和“/input-data2/data/ ”,所以设置参数“location”为“obs://input-data1/data/ | obs://input-data2/data/”。

    设置的数据格式信息是根据数据源文件的详细数据格式参数信息指定的,参数设置如下所示:

    • 数据源文件格式(format)为CSV。
    • 编码格式(encoding)为UTF-8。
    • 字段分隔符(delimiter)为E'\x08'。
    • 引号字符(quote)为E'\x1b'。
    • 是否使用加密(encrypt),默认为 “off”。
    • 用户获取OBS访问协议对应的AK值(access_key) 。
    • 用户获取OBS访问协议对应的SK值 (secret_access_key)。

      请根据用户实际获取的access_key和secret_access_key的密钥替换示例中的对应内容。

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

    • 允许每个DN上出现数据格式错误的个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。
    • 将数据导入过程中出现的数据格式错误信息(LOG INTO error_table_name)写入表customer_address_err。

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

    认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    CREATE FOREIGN TABLE tpcds.customer_address_ext
    (
    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/ | 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'
    )LOG INTO customer_address_err PER NODE REJECT LIMIT 'unlimited';
    

  5. GaussDB(DWS)上,通过外表tpcds.customer_address_ext,将数据导入目标表tpcds.customer_address。

    1
    INSERT INTO tpcds.customer_address SELECT * FROM tpcds.customer_address_ext;
    

  6. 查询错误信息表customer_address_err,处理数据导入错误。更多关于错误表的信息,请参见处理导入错误

    1
    SELECT * FROM customer_address_err;
    

  7. 在数据导入完成后,执行ANALYZE语句生成表统计信息。

    1
    ANALYZE tpcds.customer_address;