【积分活动】DBA 实战营 第十期 —— 外表(6.16 更新,快来参与,福利多多)

开篇直接一个小 demo

先展示一个通过外表读取 OceanBase 日志的小 demo,目的是让大家快速理解外表的作用。

外表的数据文件可以放在不同云服务的对象存储服务中,当然也可以是非云服务,例如本地磁盘)。

首先来到我本地磁盘中的 OceanBase 的日志目录,里面有一些以 .log 结尾的文件。

然后创建一张外表。

创建好外表之后,就可以像查询普通表一样,对 OceanBase 的日志文件进行数据库查询了。是不是很神奇~

说明:

上面 demo 中的 SERVER_LOG 只是用来作为 demo 示例,并非正式发布的版本中支持的文件格式。

目前 OceanBase 支持的是 CSV、PARQUET、ORC 等几种真正常用文件格式。

如果您在看完上面这个小 demo 之后,希望能够快速了解一下 OceanBase 中的外表能力,欢迎来 “DBA 实战营” 进行本次课程的学习,并通过在线体验获取积分和奖福利。

27 个赞

《DBA 实战营》在线课程 传送门

《外表》在线体验 传送门

活动福利

  • 参与每个章节的在线体验,即可获得积分奖励和抽奖机会(积分福利于 2025 年 6 月 30 日 0 时关闭,积分将于活动结束后 10 个工作日内发放)。

    • 仅需在课程页面中各小节后的 “在线体验” 部分,上传一张和课程内容对应的在线实验页面上包含 select now(), "xxx" as "论坛用户名"; 信息的截图,即会被判定为完成了课后练习。

    • 完成每个课后练习,均可获取 10 积分(积分将于活动结束后 10 个工作日内为大家统一发放)。

    • 第 1、20、66 到在线课堂中提交截图并通过审核的同学还将获得相应的奖品。

  • 这次是第一季的最后一期课程,奖品分别是:

  • 通过第一季全部十个章节的课后练习,即可参加最终的 DBA 实战营结课考试,并获取结课证书。通过结课考试的前 100 位用户,可以获取由 OceanBase 培训团队为大家提供的 OBCA 考试券 / OBCP 折扣券福利:

26 个赞

最后再为大家介绍一个和外表相关的特性(4.3.5 版本开始支持)—— 通过 Select Into 导出 Parquet 和 ORC 文件 作为本次课程内容的一个补充(外表是导入,下面这个是导出),欢迎感兴趣的同学进行阅读。

导出Parquet

数据类型映射

目前 OceanBase 通过 Select Into 导出 Parquet 格式支持了 MySQL 和 Oracle 数据类型,数据类型的映射表如下:

Parquet物理类型 Parquet 逻辑类型 Hive数据类型 OB-MySQL数据类型 OB-Oracle数据类型 备注
INT32 INT(8,TRUE) TINYINT TINYINT \
INT32 INT(16,TRUE) SMALLINT SMALLINT \
INT32 INT(32,TRUE) INT INT \
INT64 INT(64,TRUE) BIGINT BIGINT \
INT32 INT(8,FALSE) TINYINT(超限为null) TINYINT UNSIGNED \
INT32 INT(16,FALSE) SMALLINT(超限为null) SMALLINT UNSIGNED \
INT32 INT(32,FALSE) INT(超限为null) INT UNSIGNED \
INT64 INT(64,FALSE) BIGINT(超限为null) BIGINT UNSIGNED \
FLOAT NONE FLOAT FLOAT BINARY_FLOAT
DOUBLE NONE DOUBLE DOUBLE BINARY_DOUBLE
FIXED_LEN_BYTE_ARRAY DECIMAL DECIMAL DECIMAL, DECIMAL UNSIGNED NUMBER 必须指定precision和scale
BYTE_ARRAY STRING CHAR CHAR, BINARY CHAR Parquet的string类型都是utf8编码
BYTE_ARRAY STRING VARCHAR VARCHAR, VARBINARY VARCHAR2
BYTE_ARRAY STRING STRING TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB RAW, BLOB, CLOB
INT64 TIMESTAMP(is_adjusted_to_utc=true, parquet::LogicalType::TimeUnit::MICROS) TIMESTAMP TIMESTAMP \
INT64 TIMESTAMP(is_adjusted_to_utc=false, parquet::LogicalType::TimeUnit::MICROS) TIMESTAMP DATETIME DATE
INT96 NONE TIMESTAMP |TIMESTAMP, TIMESTAMP WITH LOCAL TIME ZONE
INT32 DATE DATE DATE \
INT64 TIME \ TIME \
INT32 INT(8,FALSE) \ YEAR \

语法

使用新增的FORMAT语法导出Parquet文件,指定type为Parquet。


SELECT * FROM t1
INTO outfile 'outfiles/data1'
FORMAT (
  TYPE = 'PARQUET',
  COMPRESSION = '<string>'
  ROW_GROUP_SIZE = '<string>' | <int>
);

COMPRESSION 用于指定Parquet文件的压缩格式,ROW_GROUP_SIZE用于指定Parquet文件的ROW GROUP大小。生成的Parquet文件后缀名为.parquet

COMPRESSION 选项支持的参数:‘UNCOMPRESSED’(表示文件没有压缩), ‘SNAPPY’, ‘GZIP’, ‘BROTLI’, ‘ZSTD’, ‘LZ4’, ‘LZ4_HADOOP’。不指定时默认值为’UNCOMPRESSED’。

ROW_GROUP_SIZE选项可以写数字,单位为字节,或者写形如’64MB’的字符串。不指定时默认值为’256MB’。建议用户使用默认值。

使用示例


-- 将t1表导出为Parquet格式的文件,文件名为data1.parquet
SELECT * FROM t1 into outfile 'data1.parquet'
  format = (TYPE = 'PARQUET');

-- 将t1表导出为Parquet格式的文件并指定压缩算法为snappy
SELECT * FROM t1 into outfile 'data1.parquet'
   format = (TYPE = 'PARQUET' COMPRESSION = 'SNAPPY');

-- 将t1表导出为Parquet格式的文件并指定row_group大小为128MB
SELECT * FROM t1 into outfile 'data1.parquet'
   format = (TYPE = 'PARQUET' ROW_GROUP_SIZE = '128MB');

-- 将t1表导出为Parquet格式的多个文件
-- 导出的文件形如:data1_0_0_0.parquet, data1_0_1_0.parquet
SELECT /*+parallel(2)*/ * FROM t1 into outfile 'data1'
format = (TYPE = 'PARQUET')
single = false;

-- 将t1表按分区导出,以c1列的值作为分区依据
-- 导出的文件形如:
-- oss://bucket_name/test_parquet/1/data_0_0_0.parquet
-- oss://bucket_name/test_parquet/2/data_0_1_0.parquet
-- oss://bucket_name/test_parquet/3/data_0_0_0.parquet
-- oss://bucket_name/test_parquet/4/data_0_1_0.parquet
SELECT /*+parallel(2)*/ * 
     FROM t1
     into outfile 'oss://bucket_name/test_parquet/?host=**&access_id=**&access_key=**'
partition by cast(c1 as char)
format = (TYPE = 'PARQUET')
single = false;

导出ORC

数据类型映射

目前OceanBase通过Select Into导出ORC格式支持了MySQL和Oracle数据类型,数据类型的映射表如下:

ORC类型 Hive数据类型 OB-MySQL数据类型 OB-Oracle数据类型
BYTE TINYINT TINYINT \
SHORT SMALLINT SMALLINT \
INT INT INT \
LONG BIGINT BIGINT \
FLOAT FLOAT FLOAT BINARY_FLOAT
DOUBLE DOUBLE DOUBLE BINARY_DOUBLE
DECIMAL DECIMAL DECIMAL NUMBER
CHAR CHAR CHAR CHAR
VARCHAR VARCHAR VARCHAR VARCHAR2
STRING STRING TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT CLOB
BINARY BINARY TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB/BINARY/VARBINARY BLOB/RAW
DATE DATE DATE \
TIMESTAMP TIMESTAMP DATETIME/TIMESTAMP DATE/TIMESTAMP/TIMESTAMP WITH LOCAL TIME ZONE

语法

使用新增的FORMAT语法导出ORC文件,指定type为ORC。


SELECT * FROM t1
  INTO outfile 'outfiles/data1'
  FORMAT = (
    TYPE = 'ORC'
    COMPRESSION = '<string>'
    COMPRESSION_BLOCK_SIZE = '<string>' | <int>
    STRIPE_SIZE = '<string>' | <int>
    ROW_INDEX_STRIDE = <int>
)

COMPRESSION 用于指定ORC文件的压缩格式。

COMPRESSION 选项支持的参数:‘UNCOMPRESSED’(表示文件没有压缩), ‘SNAPPY’, ‘ZLIB’,‘LZ4’,‘ZSTD’。不指定时默认值为’UNCOMPRESSED’。

COMPRESSION_BLOCK_SIZE 指的是数据在压缩时被分割成的块大小,可以写数字(单位为字节),或者写形如’64KB’的字符串。不指定时默认值为256 KB。建议用户使用默认值。

STRIPE_SIZE用于指定ORC文件的stripe大小,可以写数字(单位为字节),或者写形如’64MB’的字符串。不指定时默认值为64 MB。建议用户使用默认值。

ROW_INDEX_STRIDE是控制索引记录的频率的参数,定义了每隔多少行记录一次索引,不指定时默认值为10000。建议用户使用默认值。

生成的ORC文件后缀名为.orc

使用示例


-- 将t1表导出为ORC格式的文件,文件名为data1.orc
SELECT * FROM t1 into outfile 'data1.orc' format = (TYPE = 'ORC');

-- 将t1表导出为ORC格式的文件并指定压缩算法为snappy
SELECT * FROM t1 into outfile 'data1.orc'
  format = (TYPE = 'ORC' COMPRESSION = 'SNAPPY');

-- 将t1表导出为ORC格式的文件并指定STRIPE_SIZE大小为128MB
SELECT * FROM t1 into outfile 'data1.orc'
  format = (TYPE = 'ORC' STRIPE_SIZE = '128MB');

-- 将t1表导出为ORC格式的文件并指定COMPRESSION_BLOCK_SIZE大小为256KB
SELECT * FROM t1 into outfile 'data1.orc'
  format = (TYPE = 'ORC' COMPRESSION_BLOCK_SIZE = '256KB');

-- 将t1表导出为ORC格式的文件并指定ROW_INDEX_STRIDE大小为10000
SELECT * FROM t1 into outfile 'data1.orc'
  format = (TYPE = 'ORC' ROW_INDEX_STRIDE = 10000);

-- 将t1表导出为ORC格式的多个文件
-- 导出的文件形如:data1_0_0_0.orc, data1_0_1_0.orc
SELECT /*+parallel(2)*/
 *
FROM t1 into outfile 'data1'
format = (TYPE = 'ORC')
single = false;
-- 将t1表按分区导出,以c1列的值作为分区依据
-- 导出的文件形如:
-- oss://bucket_name/test_orc/1/data_0_0_0.orc
-- oss://bucket_name/test_orc/2/data_0_1_0.orc
-- oss://bucket_name/test_orc/3/data_0_0_0.orc
-- oss://bucket_name/test_orc/4/data_0_1_0.orc
SELECT /*+parallel(2)*/ * 
  FROM t1
  into outfile 'oss://bucket_name/test_orc/?host=**&access_id=**&access_key=**'
partition by cast(c1 as char)
format = (TYPE = 'ORC')
single = false;

26 个赞

来学习了!

22 个赞

来学习了!

22 个赞

:call_me_hand: :call_me_hand: :call_me_hand:

22 个赞

打卡,学习

20 个赞

新的一期开始了,打卡学习

20 个赞

欢迎欢迎

22 个赞

这个导出的用法能在obclient中使用吗?我怎么执行起来就报语法错误呢?format 后面的等号需要吗?
obclient [testdb]> SELECT * FROM ext_t1 into outfile ‘data1.parquet’ format = (TYPE = ‘PARQUET’);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘format = (TYPE = ‘PARQUET’)’ at line 1

obclient [testdb]> SELECT * FROM ext_t1 into outfile ‘data1.parquet’ format (TYPE = ‘PARQUET’);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘format (TYPE = ‘PARQUET’)’ at line 1

obclient [testdb]> SELECT * FROM ext_t1 into outfile ‘data1.parquet’ format = (TYPE = ‘PARQUET’);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘format = (TYPE = ‘PARQUET’)’ at line 1

21 个赞

ext_t3是个普通表,也还是报这个错误。
obclient [testdb]> SELECT * FROM ext_t3 into outfile ‘data1.parquet’ format = (TYPE = ‘PARQUET’);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘format = (TYPE = ‘PARQUET’)’ at line 1

另外,我想看看导出的文件缺省会放在哪个目录,我主要是想看看parquet和orc文件长啥样。

16 个赞

同学们,加油!

15 个赞

打卡,学习 :call_me_hand:

14 个赞

十期结束了,圆圆满满!

13 个赞

学习

14 个赞

yiqijiayou

12 个赞

新的一期开始了,打卡学习

15 个赞

已打卡

15 个赞

个人觉得oceanbase4这个外表的引入非常的好,解决一些特定场景下文本文件和数据库的关联使用问题,解决了dba和开发的实际使用困难问题;

12 个赞

想拥有

10 个赞