6.3 OSS中导入和导出

HybridDB支持直接从OSS中导入和导出数据,这也是HybridDB独具特色的功能之一。

1. 从OSS中导入

数据从OSS导入到HybridDB中需要如下四个步骤:

  • 准备OSS中真实数据文件的存储目录
  • 在HybridDB中建立一张外表映射到OSS中的源头表
  • 在HybridDB中建立接收数据的真实存储表
  • 调用Insert [overwrite] into select来完成数据导入

举例如下:

1)准备OSS中真实数据文件的存储目录

需要准备OSS中真实数据文件说在的目录,该目录下可以包括多个数据文件,多个数据文件的导入时并行的。

假设某个已经存在的数据文件为oss_import_test_data,数据行分隔符为换行符,列分隔符为; ,其中数据样例如下:

0001;hello_world_1
0002;hello_world_2
0003;hello_world_3
...

2)在HybridDB中创建一张外部映射表

这一步的作用是建立映射表,用于告诉HybridDB如何读取OSS源头表数据

CREATE TABLE IF NOT EXISTS oss_import_test_external_table
(
uid string,
other string
)
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"oss-xxxx.aliyuncs.com",
"url":"oss://xxx/xxx/oss_import_test_data_dir",
"accessid":"xxx",
"accesskey":"xxx",
"delimiter":";",
}'

上表定义中

  • ENGINE=OSS用于表明该表是外部表,存储引擎是外部的OSS
  • TABLE_PROPERTIES用于告诉HybridDB如何访问oss中的源头数据
    • endpoint:OSS的数据连接地址,请注意公有云和阿里集团内部是不一样的。
    • url: OSS中数据表文件所在的目录绝对地址
    • accessid: 访问OSS源头表数据的用户的accessid
    • accesskey: 访问OSS源头表数据的用户的accessKey
    • delimiter: 用于定义OSS中源头数据表的列的分隔符
    • ossescape: 转义字符, 值类型为一个char, 默认"\", 可选
    • ossquote: quote, 默认为"\"", 一个char, 主要保证字符串内容中有分隔符不被当作分隔符 可选
    • ossnull: 标识null, 有四种可选(1,EMPTY_SEPARATORS),(2,EMPTY_QUOTES),(3, BOTH), (4, NEITHER), 默认值1, 详细请参考下面的列子
    • ossstrictQuotes: 列值是否严格需要用quote引起来,详细请参考见下面的例子
    • ossignoreleadingwhitespace: 是否忽略quote前面的空格,具体请参考下面的例子
  • OSS中行的分隔符默认是换行符

    • ossstrictQuotes:

      - true
          a,"b",c --> null,"b",null
      - defalut(false)
          a,"b",c --> "a","b","c"
      
    • ossignoreleadingwhitespace

      - false
          a, "b",c --> "a"," \"b",c
      - default(true)
          a, "b",c --> "a","b","c"
      
    • ossnull

      - defalut(1)
          a,"",,c  --> "a","",NULL,"c"
      - 2
          a,"",,c  --> "a",NULL,"","c"
      - 3
          a,"",,c  --> "a",NULL,NULL,"c"
      - 4
          a,"",,c  --> "a","",","c" 
      

3)在HybridDB中创建一张真实数据表

这一步是创建目标表,用于接收从OSS中导入的源头表的数据

CREATE TABLE IF NOT EXISTS hybriddb_oss_import_test
(
uid string,
other string
)
DISTRIBUTE BY HASH(uid)
INDEX_ALL='Y'
ENGINE='CSTORE'

4) 执行sql语句开始导入

  • 方式1:实时ETL导入,实时可见

    insert into hybriddb_oss_import_test
    select * from oss_import_test_external_table
    
  • 方式2:批量ETL导入,批量可见,性能好

    insert overwrite into hybriddb_oss_import_test
    select * from oss_import_test_external_table
    

2. 导出到OSS

数据从HybridDB导出到OSS中需要如下三个步骤:

  • 准备OSS中的真实数据文件存储目录
  • 在HybridDB中建立一张目标外表映射到OSS中的数据表
  • 准备HybridDB中的数据源头表
  • 调用Insert [overwrite] into select来完成数据导出

1) 准备OSS中的真实数据文件存储目录

这一步是要确定HybridDB数据导出到OSS后要存储到哪个存储目录下,HybridDB的导出会根据并发度来动态确定要导出到指定存储目录下的数据文件数目。

2) 在HybridDB中建立一张外表映射到MySQL中的数据表

这一步的作用是建立映射表,用于告诉HybridDB如何将数据写回 OSS

CREATE TABLE IF NOT EXISTS oss_export_test_external_table
(
uid string,
other string
)
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"oss-xxxx.aliyuncs.com",
"url":"oss://xxx/xxx/oss_export_test_data_dir",
"accessid":"xxx",
"accesskey":"xxx",
"delimiter":";",
}'

上表定义中

  • ENGINE=OSS用于表明该表是外部表,存储引擎是外部的OSS
  • TABLE_PROPERTIES用于告诉HybridDB如何访问oss并向其中写入数据
    • endpoint:OSS的数据连接地址,请注意公有云和阿里集团内部是不一样的。
    • url: OSS中数据表文件所在的目录绝对地址
    • accessid: 访问OSS目标表数据的用户的accessid
    • accesskey: 访问OSS目标表数据的用户的accessKey
    • delimiter: 用于定义导出到OSS中数据表的列的分隔符
  • OSS中行的分隔符默认是换行符

3)准备HybridDB中的数据源头表

这一步是创建源头表,用于导出到OSS

CREATE TABLE IF NOT EXISTS hybriddb_oss_export_test
(
uid string,
other string
)
DISTRIBUTE BY HASH(uid)
INDEX_ALL='Y'
ENGINE='CSTORE'

4) 执行sql语句开始导出

执行如下SQL:

insert into oss_export_test_external_table
select * from hybriddb_oss_export_test

并等待任务结束后, 查看oss中的数目目录即可看到数据文件。

3. 注意事项

  1. 要求三表的DDL定义完全一致(MySQL源头表、HybridDB外表、HybridDB存储表)
  2. 这里导入导出都是同步模式,发起导入的mysql client连接需要一直保持,如需异步提交请参考6.7节

results matching ""

    No results matching ""