JDBC 外表
推荐使用 JDBC Catalog 访问 JDBC 外表。
SinceVersion 1.2.0
JDBC External Table Of Doris 提供了Doris通过数据库访问的标准接口(JDBC)来访问外部表,外部表省去了繁琐的数据导入工作,让Doris可以具有了访问各式数据库的能力,并借助Doris本身的OLAP的能力来解决外部表的数据分析问题:
- 支持各种数据源接入Doris
- 支持Doris与各种数据源中的表联合查询,进行更加复杂的分析操作
本文档主要介绍该功能的使用方式等。
具体建表语法参照:CREATE TABLE
1. 通过JDBC_Resource来创建JDBC外表
SinceVersion 1.2.1
在1.2.1及之后的版本中,可以将 driver 放到 FE/BE 的 目录下,并直接指定文件名,如:
"driver_url" = "mysql-connector-java-5.1.47.jar"
。系统会自动在 目录寻找文件。
查询用法
由于可能存在使用数据库内部的关键字作为字段名,为解决这种状况下仍能正确查询,所以在SQL语句中,会根据各个数据库的标准自动在字段名与表名上加上转义符。例如 MYSQL(``)、PostgreSQL(“”)、SQLServer([])、ORACLE(“”),所以此时可能会造成字段名的大小写敏感,具体可以通过explain sql,查看转义后下发到各个数据库的查询语句。
事务
Doris的数据是由一组batch的方式写入外部表的,如果中途导入中断,之前写入数据可能需要回滚。所以JDBC外表支持数据写入时的事务,事务的支持需要通过设置session variable: enable_odbc_transcation
(ODBC事务也受此变量控制)。
事务保证了JDBC外表数据写入的原子性,但是一定程度上会降低数据写入的性能,可以考虑酌情开启该功能。
1.Mysql测试
Mysql版本 | Mysql JDBC驱动版本 |
---|---|
8.0.30 | mysql-connector-java-5.1.47.jar |
2.PostgreSQL测试
PostgreSQL版本 | PostgreSQL JDBC驱动版本 |
---|---|
14.5 | postgresql-42.5.0.jar |
3.SQLServer测试
4.oracle测试
Oracle版本 | Oracle JDBC驱动版本 |
---|---|
11 | ojdbc6.jar |
目前只测试了这一个版本其他版本测试后补充
5.ClickHouse测试
ClickHouse版本 | ClickHouse JDBC驱动版本 |
---|---|
22 | clickhouse-jdbc-0.3.2-patch11-all.jar |
各个数据库之间数据类型存在不同,这里列出了各个数据库中的类型和Doris之中数据类型匹配的情况。
MySQL
PostgreSQL | Doris |
---|---|
BOOLEAN | BOOLEAN |
SMALLINT | SMALLINT |
INT | INT |
BIGINT | BIGINT |
VARCHAR | VARCHAR |
DATE | DATE |
TIMESTAMP | DATETIME |
REAL | FLOAT |
FLOAT | DOUBLE |
DECIMAL | DECIMAL |
Oracle
Oracle | Doris |
---|---|
VARCHAR | VARCHAR |
DATE | DATETIME |
SMALLINT | SMALLINT |
INT | INT |
REAL | DOUBLE |
FLOAT | DOUBLE |
NUMBER | DECIMAL |
ClickHouse
ClickHouse | Doris |
---|---|
BOOLEAN | BOOLEAN |
CHAR | CHAR |
VARCHAR | VARCHAR |
STRING | STRING |
DATE | DATE |
Float32 | FLOAT |
Float64 | DOUBLE |
Int8 | TINYINT |
Int16 | SMALLINT |
Int32 | INT |
Int64 | BIGINT |
Int128 | LARGEINT |
DATETIME | DATETIME |
DECIMAL | DECIMAL |
注意:
- 对于ClickHouse里的一些特殊类型,如UUID,IPv4,IPv6,Enum8可以用Doris的Varchar/String类型来匹配,但是在显示上IPv4,IPv6会额外在数据最前面显示一个,需要自己用
split_part
函数处理