文档首页> 数据仓库服务 GaussDB(DWS)> 最佳实践> 导入导出> 教程:从OBS导入数据到集群
更新时间:2024-03-06 GMT+08:00

教程:从OBS导入数据到集群

教程指引

本教程通过演示将样例数据上传OBS,以及将OBS的数据导入GaussDB(DWS)的目标表中,让您快速掌握如何从OBS导入数据到GaussDB(DWS)集群的完整过程。

GaussDB(DWS)支持通过外表将OBS上TXT、CSV、ORC、PARQUET、CARBONDATA以及JSON格式的数据导入到集群进行查询。

本教程中以CSV格式为例,进行如下操作:

  • 生成CSV格式的数据文件。
  • 创建一个与GaussDB(DWS)集群在同一区域的OBS存储桶,然后将数据文件上传到该存储桶。
  • 创建外表,用于引流OBS存储桶中的数据到GaussDB(DWS)集群。
  • 启动GaussDB(DWS)并创建数据库表后,将OBS上的数据导入到表中。
  • 根据错误表中的提示诊断加载错误并更正这些错误。

估计时间:30分钟

准备数据源文件

  • 数据文件“product_info0.csv”
    1
    2
    3
    4
    5
    100,XHDK-A,2017-09-01,A,2017 Shirt Women,red,M,328,2017-09-04,715,good!
    205,KDKE-B,2017-09-01,A,2017 T-shirt Women,pink,L,584,2017-09-05,40,very good!
    300,JODL-X,2017-09-01,A,2017 T-shirt men,red,XL,15,2017-09-03,502,Bad.
    310,QQPX-R,2017-09-02,B,2017 jacket women,red,L,411,2017-09-05,436,It's nice.
    150,ABEF-C,2017-09-03,B,2017 Jeans Women,blue,M,123,2017-09-06,120,good.
    
  • 数据文件“product_info1.csv”
    1
    2
    3
    4
    5
    200,BCQP-E,2017-09-04,B,2017 casual pants men,black,L,997,2017-09-10,301,good quality.
    250,EABE-D,2017-09-10,A,2017 dress women,black,S,841,2017-09-15,299,This dress fits well.
    108,CDXK-F,2017-09-11,A,2017 dress women,red,M,85,2017-09-14,22,It's really amazing to buy.
    450,MMCE-H,2017-09-11,A,2017 jacket women,white,M,114,2017-09-14,22,very good.
    260,OCDA-G,2017-09-12,B,2017 woolen coat women,red,L,2004,2017-09-15,826,Very comfortable.
    
  • 数据文件“product_info2.csv”
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    980,"ZKDS-J",2017-09-13,"B","2017 Women's Cotton Clothing","red","M",112,,,
    98,"FKQB-I",2017-09-15,"B","2017 new shoes men","red","M",4345,2017-09-18,5473
    50,"DMQY-K",2017-09-21,"A","2017 pants men","red","37",28,2017-09-25,58,"good","good","good"
    80,"GKLW-l",2017-09-22,"A","2017 Jeans Men","red","39",58,2017-09-25,72,"Very comfortable."
    30,"HWEC-L",2017-09-23,"A","2017 shoes women","red","M",403,2017-09-26,607,"good!"
    40,"IQPD-M",2017-09-24,"B","2017 new pants Women","red","M",35,2017-09-27,52,"very good."
    50,"LPEC-N",2017-09-25,"B","2017 dress Women","red","M",29,2017-09-28,47,"not good at all."
    60,"NQAB-O",2017-09-26,"B","2017 jacket women","red","S",69,2017-09-29,70,"It's beautiful."
    70,"HWNB-P",2017-09-27,"B","2017 jacket women","red","L",30,2017-09-30,55,"I like it so much"
    80,"JKHU-Q",2017-09-29,"C","2017 T-shirt","red","M",90,2017-10-02,82,"very good."
    
  1. 新建文本文档并使用本地编辑工具(例如Visual Studio Code)打开后,将示例数据拷贝进文本文档中。
  2. 选择“格式 > 以UTF-8无BOM格式编码”。
  3. 选择“文件 > 另存为”。
  4. 在弹出的对话框中输入文件名后,将文件后缀设为.csv,单击“保存”。

上传数据到OBS

  1. 将上面准备的3个CSV格式的数据源文件存储到OBS桶中。

    1. 登录OBS管理控制台。

      单击“服务列表”,选择“对象存储服务”,打开OBS管理控制台页面。

    2. 创建桶。

      如何创建OBS桶,具体请参见《对象存储服务》“快速入门”中的创建桶章节。

      例如,创建以下两个桶:“mybucket”和“mybucket02”。

      确保这两个桶与GaussDB(DWS)集群在同一个区域,本教程以"中国-香港”区域为例。

    3. 新建文件夹。

      具体请参见《对象存储服务控制台指南》中的新建文件夹章节。

      例如:

      • 在已创建的OBS桶“mybucket”中新建一个文件夹“input_data”。
      • 在已创建的OBS桶“mybucket02”中新建一个文件夹“input_data”。
    4. 上传文件。

      具体请参见《对象存储服务控制台指南》的上传对象章节。

      例如:

      • 将以下数据文件上传到OBS桶“mybucket”的“input_data”目录中。
        1
        2
        product_info0.csv
        product_info1.csv
        
      • 将以下数据文件上传到OBS桶“mybucket02”的“input_data”目录中。
        1
        product_info2.csv
        

  2. 为导入用户设置OBS桶的读取权限。

    在从OBS导入数据到集群时,执行导入操作的用户需要取得数据源文件所在OBS桶的读取权限。通过配置桶的ACL权限,可以将读取权限授予指定的用户账号。

    具体请参见《对象存储服务控制台指南》中的配置桶ACL章节。

创建外表

  1. 连接GaussDB(DWS)数据库。
  2. 创建外表。

    • ACCESS_KEY和SECRET_ACCESS_KEY

      用户访问OBS的AK和SK,请根据实际替换。

      获取访问密钥,请登录管理控制台,将鼠标移至右上角的用户名,单击“我的凭证”,然后在左侧导航树单击“访问密钥”。在访问密钥页面,可以查看已有的访问密钥ID(即AK),如果要同时获取AK和SK,可以单击“新增访问密钥”创建并下载访问密钥。

    • 认证用的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
    27
    28
    29
    30
    DROP FOREIGN TABLE IF EXISTS product_info_ext;
    CREATE FOREIGN TABLE product_info_ext
    (
        product_price                integer        not null,
        product_id                   char(30)       not null,
        product_time                 date           ,
        product_level                char(10)       ,
        product_name                 varchar(200)   ,
        product_type1                varchar(20)    ,
        product_type2                char(10)       ,
        product_monthly_sales_cnt    integer        ,
        product_comment_time         date           ,
        product_comment_num          integer        ,
        product_comment_content      varchar(200)                   
    ) 
    SERVER gsmpp_server 
    OPTIONS(
    LOCATION 'obs://mybucket/input_data/product_info | obs://mybucket02/input_data/product_info',
    FORMAT 'CSV' ,
    DELIMITER ',',
    ENCODING 'utf8',
    HEADER 'false',
    ACCESS_KEY 'access_key_value_to_be_replaced',
    SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',
    FILL_MISSING_FIELDS 'true',
    IGNORE_EXTRA_DATA 'true'
    )
    READ ONLY 
    LOG INTO product_info_err 
    PER NODE REJECT LIMIT 'unlimited';
    
    返回如下信息表示创建成功:
    1
    CREATE FOREIGN TABLE
    

执行数据导入

  1. GaussDB(DWS)数据库中,创建一个名为product_info的表,用于存储从OBS导入的数据。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    DROP TABLE IF EXISTS product_info;
    CREATE TABLE product_info
    (
        product_price                integer        not null,
        product_id                   char(30)       not null,
        product_time                 date           ,
        product_level                char(10)       ,
        product_name                 varchar(200)   ,
        product_type1                varchar(20)    ,
        product_type2                char(10)       ,
        product_monthly_sales_cnt    integer        ,
        product_comment_time         date           ,
        product_comment_num          integer        ,
        product_comment_content      varchar(200)                   
    ) 
    WITH (
    orientation = column,
    compression=middle
    ) 
    DISTRIBUTE BY hash (product_id);
    

  2. 执行INSERT命令,通过外表product_info_ext将OBS上的数据导入到目标表product_info 中:

    1
    INSERT INTO product_info SELECT * FROM product_info_ext;
    

  3. 执行SELECT命令查询目标表product_info,查看从OBS导入到GaussDB(DWS)中的数据。

    1
    SELECT * FROM product_info;
    

    查询结果的结尾将显示以下信息:

    (20 rows)

  1. 对表product_info执行VACUUM FULL。

    1
    VACUUM FULL product_info;
    

  2. 更新表product_info的统计信息。

    1
    ANALYZE product_info;
    

清除资源

  1. 如果执行了导入数据后查询数据,请执行以下命令,删除目标表。

    1
    DROP TABLE product_info;
    

    当结果显示为如下信息,则表示删除成功。

    DROP TABLE

  2. 执行以下命令,删除外表。

    1
    DROP FOREIGN TABLE product_info_ext;
    

    当结果显示为如下信息,则表示删除成功。

    DROP FOREIGN TABLE