Oracle连接器

概述

Oracle连接器允许在外部Oracle数据库中查询和创建表。这可用于在Oracle和Hive等不同系统之间或在两个不同的Oracle实例之间联接数据。

配置

基础配置

首先,在开始使用oracle连接器之前,应该先完成以下步骤:

  • 用于连接Oracle的JDBC连接详情

应该以常规openLooKeng连接器配置编写(例如名为oracle的openLooKeng目录使用oracle.properties)。文件应包含以下内容,并根据设置替换连接属性:

基本属性设置:

  1. connector.name=oracle
  2. connection-url=jdbc:oracle:thin:@主机:端口/ORCLCDB
  3. connection-user=用户名
  4. connection-password=密码
  • 添加Oracle驱动

Oracle JDBC驱动不在普通存储库中提供,如果您是oracle数据库的用户,您可以选择前往Oracle官方网站,在确保遵守Oracle JDBC驱动所适用的license的条件下,下载和安装Oracle JDBC驱动到存储库中。Oracle JDBC驱动(ojdbcX.jar X为数字,根据Oracle的版本不同而不同)可能会作为Oracle客户端安装的一部分进行安装,或者从Oracle办公网站下载。获取了Oracle JDBC驱动后,您可以将jdbc jar文件部署到协调节点和工作节点上的openLooKeng插件文件夹中。例如,jdbc驱动文件为ojdbcX.jar,openLooKeng插件包文件夹为 /usr/lib/presto/lib/plugin,则拷贝命令如下: cp ojdbcX.jar /usr/lib/presto/lib/plugin/oracle。重启协调节点和工作节点进程,oracle连接器即可正常工作。

  • 是否开启查询下推功能

如果要启用oracle连接器的连接器下推功能,不需要做任何操作,oracle连接器的下推功能默认是打开的。但也可以按如下设置:

  1. jdbc.pushdown-enabled=true
  2. #true表示打开下推,false表示关闭。
  • 下推模式选择。

如果要启用oracle连接器的全部下推功能,不需要做任何操作,oracle连接器的下推模式默认是全部下推的。但也可以按如下设置:

  1. jdbc.pushdown-module=FULL_PUSHDOWN
  2. #FULL_PUSHDOWN,表示全部下推;BASE_PUSHDOWN,表示部分下推,其中部分下推是指filter/aggregation/limit/topN/project这些可以下推。

多套Oracle数据库或服务器

如果要连接到多个Oracle数据库,请将Oracle插件的另一个实例配置为一个单独的目录。如需添加其他Oracle目录,请在 ../conf/catalog 下添加不同名称的另一属性文件(注意结尾为 .properties )。例如,在 ../conf/catalog 目录下新增一个名称为 oracle2.properties 的文件,则新增一个名称为oracle2的连接器。

通过openLooKeng查询Oracle

对于名为oracle的oracle连接器,每个Oracle数据库的用户都可以通过oracle连接器获取其可用的模式,命令为SHOW SCHEMAS

  1. SHOW SCHEMAS FROM oracle;

如果已经拥有了可用模式,可以通过SHOW TABLES命令查看名为data的Oracle数据库拥有的表:

  1. SHOW TABLES FROM oracle.data;

若要查看数据模式中名为hello的表中的列的列表,请使用以下命令中的一种:

  1. DESCRIBE oracle.data.hello;
  2. SHOW COLUMNS FROM oracle.data.hello;

你可以访问数据模式中的hello表:

  1. SELECT * FROM oracle.data.hello;

连接器在这些模式中的权限是在连接属性文件中配置的用户的权限。如果用户无法访问这些表,则特定的连接器将无法访问这些表。

Oracle Update/Delete 支持

使用Oracle连接器创建表

示例:

  1. CREATE TABLE oracle_table (
  2. id int,
  3. name varchar(255));

对表执行INSERT

示例:

  1. INSERT INTO oracle_table
  2. VALUES
  3. (1, 'foo'),
  4. (2, 'bar');

对表执行UPDATE

示例:

  1. UPDATE oracle_table
  2. SET name='john'
  3. WHERE id=2;

上述示例将值为2的列id的行的列name的值更新为john

UPDATE前的SELECT结果:

  1. lk:default> SELECT * FROM oracle_table;
  2. id | name
  3. ----+------
  4. 2 | bar
  5. 1 | foo
  6. (2 rows)

UPDATE后的SELECT结果

  1. lk:default> SELECT * FROM oracle_table;
  2. id | name
  3. ----+------
  4. 2 | john
  5. 1 | foo
  6. (2 rows)

对表执行DELETE

示例:

  1. DELETE FROM oracle_table
  2. WHERE id=2;

以上示例删除了值为2的列id的行。

DELETE前的SELECT结果:

  1. lk:default> SELECT * FROM oracle_table;
  2. id | name
  3. ----+------
  4. 2 | john
  5. 1 | foo
  6. (2 rows)

DELETE后的SELECT结果:

  1. lk:default> SELECT * FROM oracle_table;
  2. id | name
  3. ----+------
  4. 1 | foo
  5. (1 row)

openLooKeng和Oracle之间的数据类型映射

类型相关配置说明

配置项描述默认值
unsupported-type.handling-strategy配置如何处理不受支持的列数据类型:
FAIL-直接报错。
IGNORE -无法访问列。
CONVERT_TO_VARCHAR-列转换为无界VARCHAR
FAIL
oracle.number.default-scaleOracle的number数据类型未指定精度和小数位数时,转换为openLooKeng数据类型,会根据该配置进行精度转换。0
oracle.number.rounding-modeOracleNUMBER数据类型的舍入模式。当OracleNUMBER数据类型指定的规模大于Presto支持的规模时,此功能很有用。可能的值为:
UNNECESSARY -舍入模式,以断言所请求的操作具有精确的结果,因此不需要舍入。
CEILING -向正无穷大舍入。
FLOOR -向负无穷大舍入。
HALF_DOWN -向最近的邻居舍入,若是两个邻居距离相等,则向下舍入模式
HALF_EVEN-向最近的邻居舍入,若是两个邻居距离相等,则向偶数邻居舍入。
HALF_UP-向最近的邻居舍入,若是两个邻居距离相等,则向上舍入。
UP -舍入模式向零舍入。
DOWN -舍入模式向零舍入。
UNNECESSARY

Oracle到openLooKeng类型映射

openLooKeng支持选择以下Oracle数据库类型。下表显示了Oracle数据类型的映射关系。

数据类型映射表

Oracle数据库类型openLooKeng类型说明
DECIMAL(p, s)DECIMAL(p, s)
NUMBER(p)DECIMAL(p, 0)
FLOAT(p)DOUBLE
BINARY_FLOATREAL
BINARY_DOUBLEDOUBLE
VARCHAR2(n CHAR)VARCHAR(n)
VARCHAR2(n BYTE)VARCHAR(n)
CHAR(n)CHAR(n)
NCHAR(n)CHAR(n)
CLOBVARCHAR
NCLOBVARCHAR
RAW(n)VARCHAR
BLOBVARBINARY
DATETIMESTAMP
TIMESTAMP(p)TIMESTAMP
TIMESTAMP(p) WITH TIME ZONETIMESTAMP WITH TIME ZONE

openLooKeng到Oracle类型映射

openLooKeng支持在Oracle数据库中创建以下类型的表。下表显示了从openLooKeng到Oracle数据类型的映射关系。

数据类型映射表

openLooKeng类型Oracle数据库类型说明
TINYINTNUMBER(3)
SMALLINTNUMBER(5)
INTEGERNUMBER(10)
BIGINTNUMBER(19)
DECIMAL(p, s)NUMBER(p, s)
REALBINARY_FLOAT
DOUBLEBINARY_DOUBLE
VARCHARNCLOB
VARCHAR(n)VARCHAR2(n CHAR) or NCLOB
CHAR(n)CHAR(n CHAR) or NCLOB
VARBINARYBLOB
DATEDATE
TIMESTAMPTIMESTAMP(3)
TIMESTAMP WITH TIME ZONETIMESTAMP(3) WITH TIME ZONE

openLooKeng与Oracle之间的常用共有函数

openLooKeng与Oracle之间存在一些常用的共有函数。具体函数功能请参考openLooKeng中函数和运算符部分的文档和Oracle官网。下表列出了这些常用共有函数。

函数名称说明
abs数学函数
acos数学函数
asin数学函数
atan数学函数
ceil数学函数
cos数学函数
cosh数学函数
exp数学函数
floor数学函数
ln数学函数
round数学函数
sign数学函数
sin数学函数
sqrt数学函数
tan数学函数
tanh数学函数
mod数学函数
concat字符串函数
greatest字符串函数
least字符串函数
length字符串函数
lower字符串函数
ltrim字符串函数
replace字符串函数
rpad字符串函数
rtrim字符串函数
trim字符串函数
upper字符串函数
reverse字符串函数
regexp_like字符串函数
regexp_replace字符串函数
avg聚合函数
count聚合函数
max聚合函数
min聚合函数
stddev聚合函数
sum聚合函数
variance聚合函数

Oracle SQL与openLooKeng SQL语法差异

openLooKeng支持标准的SQL 2003语法,与Oracle SQL语法存在差异。要将Oracle的SQL语句运行在openLooKeng中,需要对SQL语句进行等价的语法转换。Oracle与openLooKeng SQL语法详细细节,请参考官方文档。

Oracle Synonyms的支持

基于性能的考虑,openLooKeng默认关闭了Oracle 的SYNONYM 功能。可以通过以下配置来开启:

  1. oracle.synonyms.enabled=true

Oracle连接器的限制

  • openLooKeng支持连接Oracle 11g和Oracle 12c。

  • Oracle连接器暂不支持Update下推功能。

Oralce的number数据类型

Oralce中的number类型的精度长度是可变的,但openLooKeng不支持。由于这个原因,若oracle表在使用number类型时,未明确指定精度,openLooKeng将oracle的number类型转换openLooKeng的decimal类型时,在特定的取值范围内会造成一些精度损失。