当前位置: 首页 > news >正文

如何利用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等,以及支持压缩格式。目前外表的文件无法进行筛选,未来我们还会支持外表的分区,通过分区可以进行文件的裁剪,提高查询性能。

相关文章:

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

为什么需要使用外表 在日常的业务场景中&#xff0c;经常遇到需要在数据库中处理外部数据的情况&#xff0c;这些数据可能来源于应用程序&#xff0c;或者是其他业务系统。一般来说&#xff0c;常是通过ETL工具将外部数据库的数据导入到数据库内部的表中&#xff0c;再进行分析…...

【灵境矩阵】零代码创建AI智能体之行业词句助手

欢迎来到《小5讲堂》 这是《灵境矩阵》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 创建智能体选择创建方式零代码 基础配置头像名称简介指令开场白…...

springboot 防抖操作

大佬的代码&#xff1a;看这里 原理&#xff1a; 通过aop切面编程&#xff0c;在调用接口前缓存接口信息&#xff0c;将信息缓存到redis中&#xff0c;在规定时间内重复调用接口&#xff0c;会被拦截请求 有个地方感觉不太合理&#xff0c;在使用中我将其修改了 //前略 publi…...

Playwright录制脚本 —— web自动化测试!

简介&#xff1a; 在编写 web 自动化测试用例时&#xff0c;代码编写的速度是否快&#xff0c;会影响框架的使用体验。现在很多的框架都会提供一些辅助功能&#xff0c;帮助我们更快的去编写自动化测试代码&#xff0c;而录制功能是几乎所有的web自动化工具都会带的功能。在实际…...

什么是工业级物联网智能网关?如何远程控制PLC?

在数字化浪潮席卷全球的今天&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为推动工业转型升级的关键力量。而在工业物联网的大家庭中&#xff0c;工业级物联网智能网关扮演着举足轻重的角色。那么&#xff0c;究竟什么是工业级物联网智能网关&#xff1f;又该如何…...

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.04.05-2024.04.10

文章目录~ 1.Learn from Failure: Fine-Tuning LLMs with Trial-and-Error Data for Intuitionistic Propositional Logic Proving2.Continuous Language Model Interpolation for Dynamic and Controllable Text Generation3.Event Grounded Criminal Court View Generation w…...

javascript:call()、apply()、bind()的区别和使用

javascript&#xff1a;call()、apply()、bind()的区别和使用 1 前言 记录javascript的call、apply、bind方法绑定this的区别以及使用。 call、apply、bind的区别&#xff1a; 【相同点】&#xff1a;作用相同&#xff0c;都是动态修改this指向&#xff1b;都不会修改原先函…...

ubuntu系统安装systemc-2.3.4流程

背景&#xff1a;systemC编程在linux下的基础环境配置 1&#xff0c;下载安装包&#xff0c;并解压 &#xff08;先下载了最新的3.0.0&#xff0c;安装时候显示sc_cmnhdr.h:115:5: error: #error **** SystemC requires a C compiler version of at least C17 **** &#xff…...

Java开发中的entity、vo和pojo

Java开发中的entity、vo和pojo 1.Entity实体2.vo3.pojo 1.Entity实体 定义&#xff1a; Entity 通常指的是与数据库表对应的对象。它包含了与数据库表字段相对应的属性和一些业务逻辑方法。Entity 通常用于数据的持久化操作&#xff0c;如增删改查。使用场景&#xff1a; 当需…...

通过IPV6+DDNS实现路由器远程管理和Win远程桌面控制

前期需要的准备&#xff1a; 软路由&#xff0c;什么系统都可以&#xff0c;要支持IPV6&#xff0c;能够自动添加解析 光猫的管理员账号&#xff0c;能够进入光猫修改配置&#xff0c;拨号上网账号 域名账号和DNS服务 主要步骤&#xff1a; 利用管理员账号&#xff0c;进入…...

数据湖/数据仓库

数据湖&#xff08;Data Lake&#xff09;和数据仓库&#xff08;Data Warehouse&#xff09;的主要区别在于它们的目的、存储的数据类型、数据处理方式、数据结构、数据安全性以及数据应用。以下是相关介绍&#xff1a; 目的。数据湖旨在作为一个集中的存储库&#xff0c;存储…...

万兆以太网MAC设计(2)MAC_RX模块

文章目录 前言一、模块功能二、代码三、仿真波形 前言 上文我们打通了了万兆以太网物理层和数据链路层&#xff0c;其实就是会使用IP核了&#xff0c;本文将正式开始MAC层设计第一篇&#xff0c;接收端设计。 一、模块功能 MAC_RX模块功能如下&#xff1a; 解析接收的报文&…...

D. Solve The Maze Codeforces Round 648 (Div. 2)

题目链接&#xff1a; Problem - 1365D - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/problemset/problem/1365/D 题目大意&#xff1a; 有一张地图n行m列&#xff08;地图外面全是墙&#xff09;&#xff0c…...

CPU核心数、线程数都是什么意思?

最早&#xff0c;每个物理 cpu 上只有一个核心&#xff0c;对操作系统而言&#xff0c;也就是同一时刻只能运行一个进程/线程。 为了提高性能&#xff0c;cpu 厂商开始在单个物理 cpu 上增加核心&#xff08;实实在在的硬件存在&#xff09;&#xff0c;也就出现了多核 cpu&…...

每日一篇 4.12

misstep&#xff1a;失误 epic proportions.&#xff1a;史无前例 arguably&#xff1a;按理来说 assembly&#xff1a;组装 performed &#xff1a;执行 underpins&#xff1a;支撑 holds a monopoly&#xff1a;垄断了 shipped&#xff1a;发货 a market capitalizati…...

鸿蒙南向开发:【智能烟感】

样例简介 智能烟感系统通过实时监测环境中烟雾浓度&#xff0c;当烟雾浓度超标时&#xff0c;及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程配置智能烟感系统的报警阈值&#xff0c;远程接收智能烟感系统报警信息。实现对危险及时报…...

【主题广|检索稳定】2024年生态工程与农业科技国际会议 (EEAT 2024)

2024年生态工程与农业科技国际会议 (EEAT 2024) 2024 International Conference on Ecological Engineering and Agricultural Technology 【会议简介】 2024年生态工程与农业科技国际会议即将在贵阳召开。本次会议将汇集全球生态工程与农业科技领域的专家学者&#xff0c;共…...

代码随想录算法训练营第三十八天|509. 斐波那契数、 70. 爬楼梯、746. 使用最小花费爬楼梯

509 题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c…...

07-app端文章搜索

app端文章搜索 1) 今日内容介绍 1.1)App端搜索-效果图 1.2)今日内容 文章搜索 ElasticSearch环境搭建 索引库创建 文章搜索多条件复合查询 索引数据同步 搜索历史记录 Mongodb环境搭建 异步保存搜索历史 查看搜索历史列表 删除搜索历史 联想词查询 联想词的来源 联…...

✔ ★Java项目——设计一个消息队列(二)

Java项目——设计一个消息队列 四. 项⽬创建五. 创建核⼼类创建 Exchange&#xff08;名字、类型、持久化&#xff09;创建 MSGQueue&#xff08;名字、持久化、独占标识&#xff09;创建 Binding&#xff08;交换机名字、队列名字、bindingKey用于与routingKey匹配&#xff09…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...