如何利用OceanBase v4.2的 外部表简化外部数据处理

为什么需要使用外表

在日常的业务场景中,经常遇到需要在数据库中处理外部数据的情况,这些数据可能来源于应用程序,或者是其他业务系统。一般来说,常是通过ETL工具将外部数据库的数据导入到数据库内部的表中,再进行分析处理。而通过外部表,则可以直接访问外部文件,并读取外部数据文件进行处理,这样做有几个好处:

  • 可以减少数据的拷贝,节省数据库存储空间。
  • 提高数据的共享,避免数据出现不一致的情况。
  • 删除外表时,原库的数据不会被删除。

此外,外部表相比普通表具有更丰富的功能:

  • 支持多种存储方式:例如数据文件可以放在不同云服务的对象存储服务中。
  • 支持多种存储格式:例如CSV格式。

需要额外说明的是,外表不支持DML。

外表的用法示例

步骤1: 准备外部表数据

我们在阿里云的对象存储OSS中存放了TPCH 1G的数据,其中lineitem的表的数据分成了10个文件放在mydata/tpch_1g_data/lineitem中

object list is:
71.96MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.1 
72.63MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.10 
72.10MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.2 
72.57MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.3 
72.51MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.4 
72.57MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.5 
72.72MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.6 
72.48MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.7 
72.60MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.8 
72.53MB Standard oss://mydata/tpch_1g_data/lineitem/lineitem.tbl.9 

步骤2: 创建外表

外表的用法和普通表非常相似,比普通表多了 LOCATION 和 FORMAT 属性。其中 LOCATION 用于指定数据文件所在位置,FORMAT 指定数据文件的格式。

CREATE EXTERNAL TABLE lineitem
(L_ORDERKEY     int,L_PARTKEY      int,L_SUPPKEY      int,L_LINENUMBER   int,L_QUANTITY     DECIMAL(15,2),L_EXTENDEDPRICE  DECIMAL(15,2),L_DISCOUNT     DECIMAL(15,2),L_TAX          DECIMAL(15,2),L_RETURNFLAG   CHAR(1),L_LINESTATUS   CHAR(1),L_SHIPDATE     DATE,L_COMMITDATE   DATE,L_RECEIPTDATE  DATE,L_SHIPINSTRUCT CHAR(25),L_SHIPMODE     CHAR(10),L_COMMENT      VARCHAR(44)
)
LOCATION = 'oss://$ACCESS_ID:$ACCESS_KEY@$HOST/tpch_1g_data/lineitem/'
FORMAT = (TYPE = 'CSV'FIELD_DELIMITER = '|'
);

如果文件中的列顺序和表中的列顺序不一致,可以通过通过metadata$filecolN 伪列进行对应,具体可以参考 用户文档

步骤3: 查看外表的文件

外表创建时,会将LOCATION下的文件列表保存在一个文件列表中,外表扫描时只会访问这个列表下的外部文件。

通过以下语句可以查看外表的文件列表

select * from DBA_EXTERNAL_TABLE_FILES where table_name = 'lineitem';

当外部数据文件有变化时,可以执行以下语句更新外表的文件列表

alter external table lineitem refresh;

如果文件被删除且未更新文件列表,外表查询时会自动忽略这个文件。

步骤4: 查询外表

外表查询时,通过外表的驱动层直接读取外部文件,并按照文件格式进行解析,转换成OceanBase内部的数据类型后返回数据行。

obclient>select * from lineitem limit 10;
+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+------------+--------------+---------------+-------------------+------------+-------------------------------------+
| L_ORDERKEY | L_PARTKEY | L_SUPPKEY | L_LINENUMBER | L_QUANTITY | L_EXTENDEDPRICE | L_DISCOUNT | L_TAX | L_RETURNFLAG | L_LINESTATUS | L_SHIPDATE | L_COMMITDATE | L_RECEIPTDATE | L_SHIPINSTRUCT    | L_SHIPMODE | L_COMMENT                           |
+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+------------+--------------+---------------+-------------------+------------+-------------------------------------+
|          1 |    155190 |      7706 |            1 |      17.00 |        21168.23 |       0.04 |  0.02 | N            | O            | 1996-03-13 | 1996-02-12   | 1996-03-22    | DELIVER IN PERSON | TRUCK      | egular courts above the             |
|          1 |     67310 |      7311 |            2 |      36.00 |        45983.16 |       0.09 |  0.06 | N            | O            | 1996-04-12 | 1996-02-28   | 1996-04-20    | TAKE BACK RETURN  | MAIL       | ly final dependencies: slyly bold   |
|          1 |     63700 |      3701 |            3 |       8.00 |        13309.60 |       0.10 |  0.02 | N            | O            | 1996-01-29 | 1996-03-05   | 1996-01-31    | TAKE BACK RETURN  | REG AIR    | riously. regular, express dep       |
|          1 |      2132 |      4633 |            4 |      28.00 |        28955.64 |       0.09 |  0.06 | N            | O            | 1996-04-21 | 1996-03-30   | 1996-05-16    | NONE              | AIR        | lites. fluffily even de             |
|          1 |     24027 |      1534 |            5 |      24.00 |        22824.48 |       0.10 |  0.04 | N            | O            | 1996-03-30 | 1996-03-14   | 1996-04-01    | NONE              | FOB        |  pending foxes. slyly re            |
|          1 |     15635 |       638 |            6 |      32.00 |        49620.16 |       0.07 |  0.02 | N            | O            | 1996-01-30 | 1996-02-07   | 1996-02-03    | DELIVER IN PERSON | MAIL       | arefully slyly ex                   |
|          2 |    106170 |      1191 |            1 |      38.00 |        44694.46 |       0.00 |  0.05 | N            | O            | 1997-01-28 | 1997-01-14   | 1997-02-02    | TAKE BACK RETURN  | RAIL       | ven requests. deposits breach a     |
|          3 |      4297 |      1798 |            1 |      45.00 |        54058.05 |       0.06 |  0.00 | R            | F            | 1994-02-02 | 1994-01-04   | 1994-02-23    | NONE              | AIR        | ongside of the furiously brave acco |
|          3 |     19036 |      6540 |            2 |      49.00 |        46796.47 |       0.10 |  0.00 | R            | F            | 1993-11-09 | 1993-12-20   | 1993-11-24    | TAKE BACK RETURN  | RAIL       |  unusual accounts. eve              |
|          3 |    128449 |      3474 |            3 |      27.00 |        39890.88 |       0.06 |  0.07 | A            | F            | 1994-01-16 | 1993-11-22   | 1994-01-23    | DELIVER IN PERSON | SHIP       | nal foxes wake.                     |
+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+------------+--------------+---------------+-------------------+------------+-------------------------------------+
10 rows in set

性能测试示例

下面我们对外表进行简单的性能测试,以本地文件场景和CSS文件场景为例,测试环境如下:

  • CPU Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz 
  • DATA:TPCH 1G 的文本文件,文件格式CSV,每个表的数据拆成10个文件
  • 兼容模式:Oracle
  • OB版本 4.2

场景1:本地文件场景

串行扫描

obclient>select count(*) from LINEITEM;
+----------+
| COUNT(*) |
+----------+
|  6001215 |
+----------+
1 row in set (7.987 sec)

并行扫描

obclient>select /*+ parallel(10) */ count(*) from LINEITEM;
+----------+
| COUNT(*) |
+----------+
|  6001215 |
+----------+
1 row in set (2.035 sec)
场景2: OSS文件

串行扫描

obclient>select count(*) from LINEITEM;
+----------+
| COUNT(*) |
+----------+
|  6001215 |
+----------+
1 row in set (1 min 24.247 sec)

并行扫描

obclient>select /*+ parallel(10) */ count(*) from LINEITEM;
+----------+
| COUNT(*) |
+----------+
|  6001215 |
+----------+
1 row in set (8.790 sec)

其他复杂SQL的场景示例

示例1

外表可以像普通表一样与其他表进行链接,谓词过滤,聚合,排序等操作。

外表可以通过parallel hint开启并行查询。

下面例子中,customer/orders/lineitem 均为外表。

obclient> SELECT * FROM(SELECT /*+ parallel(10) */l_orderkey,o_orderdate,o_shippriority,sum(l_extendedprice * (1 - l_discount)) AS revenueFROM customer,orders,lineitemWHERE c_mktsegment = 'BUILDING'AND c_custkey = o_custkeyAND l_orderkey = o_orderkeyAND o_orderdate < '1995-03-15'AND l_shipdate > '1995-03-15'GROUP BY l_orderkey,o_orderdate,o_shippriorityORDER BY revenue DESC, o_orderdate)WHERE ROWNUM <= 10;
+------------+---------------------+----------------+-------------+
| L_ORDERKEY | O_ORDERDATE         | O_SHIPPRIORITY | REVENUE     |
+------------+---------------------+----------------+-------------+
|    2456423 | 1995-03-05 00:00:00 |              0 | 406181.0111 |
|    3459808 | 1995-03-04 00:00:00 |              0 | 405838.6989 |
|     492164 | 1995-02-19 00:00:00 |              0 |  390324.061 |
|    1188320 | 1995-03-09 00:00:00 |              0 | 384537.9359 |
|    2435712 | 1995-02-26 00:00:00 |              0 | 378673.0558 |
|    4878020 | 1995-03-12 00:00:00 |              0 | 378376.7952 |
|    5521732 | 1995-03-13 00:00:00 |              0 | 375153.9215 |
|    2628192 | 1995-02-22 00:00:00 |              0 | 373133.3094 |
|     993600 | 1995-03-05 00:00:00 |              0 | 371407.4595 |
|    2300070 | 1995-03-13 00:00:00 |              0 | 367371.1452 |
+------------+---------------------+----------------+-------------+
10 rows in set
示例2

外表可以与普通表组合进行查询操作。

下面例子中,temp是普通表,orders是外表。

obclient> SELECT temp.* from temp, orders WHERE temp.c1 = orders.O_ORDERDATE and rownum < 5;
+---------------------+
| C1                  |
+---------------------+
| 1995-03-05 00:00:00 |
| 1995-02-22 00:00:00 |
| 1995-02-22 00:00:00 |
| 1995-03-13 00:00:00 |
+---------------------+
4 rows in set
示例3

外表可以实现将外部数据导入普通表的操作。

下面例子中,lineitem_import 为普通表,lineitem为外部表,通过PDML功能可以将外表lineitem数据并行导入普通表lineitem_import。

INSERT /*+ enable_parallel_dml parallel(10) */ INTO lineitem_import
SELECT * FROM lineitem;

展望未来

未来外表计划会支持更多的数据源驱动,例如aws和cos等,支持更丰富的数据格式,例如parquet和orc等,以及支持压缩格式。目前外表的文件无法进行筛选,未来我们还会支持外表的分区,通过分区可以进行文件的裁剪,提高查询性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyRecovery数据恢复软件好不好用?值不值得下载

EasyRecovery数据恢复软件是一款专业且功能强大的数据恢复工具&#xff0c;它旨在帮助用户从各种存储设备中恢复由于各种原因&#xff08;如误删除、格式化、病毒攻击、系统崩溃等&#xff09;导致丢失的数据。这款软件支持多种存储介质&#xff0c;包括但不限于硬盘驱动器、U盘…

分布式监控平台---Zabbix

一、Zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; 通过一个友好的界面进行浏览整个…

go结构体嵌套递归调用的2种方式--struct和func

1: 需要嵌套部分是结构体类型的&#xff0c;例如&#xff1a;快照 套 子快照&#xff0c;但是子快照长得和快照一样&#xff08;同一份结构体&#xff09;&#xff0c;可以无限递归套娃&#x1fa86; // ResRootSnapshot ... type ResRootSnapshot struct {// 快照标识Urn str…

Java实现单点登录(SSO)详解:从理论到实践

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

【Maven工具】

maven Maven是一个主要用于Java项目的构建自动化工具。它有助于管理构建过程&#xff0c;包括编译源代码、运行测试、将编译后的代码打包成JAR文件以及管理依赖项。Maven使用项目对象模型&#xff08;POM&#xff09;文件来描述项目配置和依赖关系。 Maven通过提供标准的项目…

(三)C++自制植物大战僵尸游戏项目结构说明

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、项目结构 打开项目后&#xff0c;在解决方案管理器中有五个项目&#xff0c;分别是libbox2d、libcocos2d、librecast、libSpine、PlantsVsZombies五个项目&#xff0c;除PlantsVsZombies外&#xff0c;其他四个…

第十五届蓝桥杯研究生组Java软件开发组总结

2024年十五届蓝桥杯研究生组 今年的题较去年难度降低了很多&#xff0c;题量也少了2道。 Q1 劲舞团 读文件&#xff0c;找到最长的满足条件的子数组的长度 答案是&#xff1a;9 BufferedReader&#xff0c;fopen&#xff0c;open Q2 召唤数学精灵 找规律&#xff0c;周期…

SELinux详解

SELinux是一种安全增强的Linux操作系统的安全子系统。它是由美国国家安全局&#xff08;NSA&#xff09;与Red Hat公司合作开发的&#xff0c;旨在提供高级的访问控制和强制访问控制&#xff08;MAC&#xff09;机制。 SELinux的目标是通过在操作系统内核中实施强大的访问控制…

【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法分析与设计知识专栏&#xff1a;算法分析&#x1f525; 给大家跳…

基于springboot+vue实现的疫情防控物资调配与管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

家居网购项目(权限验证+事务管理)

文章目录 1.过滤器权限认证1.程序框架图2.web.xml3.编写AdminAuthorization4.编写MemberAuthorization5.细节6.结果展示1.未登录可以任意浏览商品2.点击添加购物车提示登录3.点击后台管理&#xff0c;提示管理员登录4.也做了其余资源的访问验证 2.事务管理1.思路分析2.重写JDBC…

程序猿之路

我接触计算机算对自己来说是比较晚的了&#xff0c;上初中的时候就有微机课&#xff0c;但是在那个小县城&#xff0c;上课也只是3个人共用一个电脑&#xff0c;我初中整个过程只会开关机&#xff0c;哈哈&#xff0c;虽然学过word&#xff0c;但是无奈&#xff0c;我插不上手呀…

AJAX请求(axios篇)

目录 一、axios介绍 1.概念 2.功能 3.好处 二、axios用法 1.安装方法 2.GET方法 3.POST方法 4.执行多个并发请求 5.axios API 6.请求方法的别名 7.async/await异步请求 三、axios实例 四、总结 一、axios介绍 1.概念 AJAX是“Asynchronous JavaScript and XML”…

开源相机管理库Aravis例程学习(三)——注册回调multiple-acquisition-callback

开源相机管理库Aravis例程学习&#xff08;三&#xff09;——回调multiple-acquisition-callback 简介例程代码arv_camera_create_streamArvStreamCallbackTypeArvStreamCallback 简介 本文针对官方例程中的&#xff1a;02-multiple-acquisition-callback做简单的讲解。 ara…

ActiveMQ 04 Linux下安装

Active MQ 04 Linux下安装 下载 解压 在init.d下建立软连接 ln -s /usr/local/activemq/bin/activemq ./设置开启启动 chkconfig activemq on 服务管理 service activemq start service activemq status service activemq stopNIO配置 默认配置为tcp&#xff0c;使用的…

C语言 | Leetcode C语言题解之第30题串联所有单词的子串

题目&#xff1a; 题解&#xff1a; typedef struct {char key[32];int val;UT_hash_handle hh; } HashItem;int* findSubstring(char * s, char ** words, int wordsSize, int* returnSize){ int m wordsSize, n strlen(words[0]), ls strlen(s);int *res (int *)mall…

深入理解ClickHouse 的高性能与高可用原理

架构 ClickHouse 的架构设计旨在提供高性能、高吞吐量的数据存储和查询能力&#xff0c;特别适合处理大规模数据集和实时分析场景。ClickHouse 的架构可以分为几个关键组成部分&#xff0c;它们共同工作以提供高效的数据处理能力和高可用性。 主要组件 1. 存储引擎 ClickHo…

【opencv】示例-videocapture_starter.cpp 从视频文件、图像序列或连接到计算机的摄像头中捕获帧...

/** * file videocapture_starter.cpp * brief 一个使用OpenCV的VideoCapture与捕获设备&#xff0c;视频文件或图像序列的入门示例 * 就像CV_PI一样简单&#xff0c;对吧&#xff1f; * * 创建于: 2010年11月23日 * 作者: Ethan Rublee * * 修改于: 2013年4月17日 * …

【ES6】使用记录

Symbol const sym Symbol(Mo_qyue); console.log(sym.description) //Mo_qyue作为属性名Symbol let mySymbol Symbol() let a {} a[mySymbol] hello; console.log(a[mySymbol]) //hellolet b{[mySymbol]:hello} console.log(b[mySymbol]) //hellolet cObject.defineProp…

金蝶云星空与领星ERP对接集成分布式调入单查询打通添加/编辑本地产品

金蝶云星空与领星ERP对接集成分布式调入单查询打通添加/编辑本地产品 接通系统&#xff1a;金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的…