JDBC Catalog

最近更新时间:2023-10-23 10:46:12

我的收藏
说明:
该功能适用于 Doris 1.2及后续版本。
JDBC Catalog 通过标准 JDBC 协议,连接其他数据源。连接后,Doris 会自动同步数据源下的 Database 和 Table 的元数据,以便快速访问这些外部数据。

创建 Catalog

MySQL

CREATE CATALOG jdbc_mysql PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:mysql://127.0.0.1:3306/demo",
"driver_url" = "mysql-connector-java-5.1.47.jar",
"driver_class" = "com.mysql.jdbc.Driver");

PostgreSQL

CREATE CATALOG jdbc_postgresql PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:postgresql://127.0.0.1:5449/demo",
"driver_url" = "postgresql-42.5.1.jar",
"driver_class" = "org.postgresql.Driver");
映射 PostgreSQL 时,Doris 的一个 Database 对应于 PostgreSQL 中指定 Catalog 下的一个 Schema(如示例中 jdbc_url 参数中 "demo"下的 schemas)。而 Doris 的 Database 下的 Table 则对应于 PostgreSQL 中,Schema 下的 Tables。即映射关系如下:
Doris
PostgreSQL
Catalog
Database
Database
Schema
Table
Table
Doris 通过 SQL 语句来获得 PG user 能够访问的所有 schema 并将其映射为 Doris 的 database
select nspname from pg_namespace where has_schema_privilege('<UserName>', nspname, 'USAGE');

Oracle

CREATE CATALOG jdbc_oracle PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:oracle:thin:@127.0.0.1:1521:helowin",
"driver_url" = "ojdbc6.jar",
"driver_class" = "oracle.jdbc.driver.OracleDriver");
映射 Oracle 时,Doris 的一个 Database 对应于 Oracle 中的一个 User。而 Doris 的 Database 下的 Table 则对应于 Oracle 中,该 User 下的有权限访问的 Table。即映射关系如下:
Doris
Oracle
Catalog
Database
Database
User
Table
Table

Clickhouse

CREATE CATALOG jdbc_clickhouse PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:clickhouse://127.0.0.1:8123/demo",
"driver_url" = "clickhouse-jdbc-0.3.2-patch11-all.jar",
"driver_class" = "com.clickhouse.jdbc.ClickHouseDriver");

SQLServer

CREATE CATALOG sqlserver_catalog PROPERTIES (
"type"="jdbc",
"user"="SA",
"password"="Doris123456",
"jdbc_url" = "jdbc:sqlserver://localhost:1433;DataBaseName=doris_test", "driver_url" = "mssql-jdbc-11.2.3.jre8.jar",
"driver_class" = "com.microsoft.sqlserver.jdbc.SQLServerDriver");
映射 SQLServer 时,Doris 的一个 Database 对应于 SQLServer 中指定 Database(如示例中 jdbc_url 参数中的 "doris_test")下的一个 Schema。而 Doris 的 Database 下的 Table 则对应于 SQLServer 中,Schema 下的 Tables。即映射关系如下:
Doris
SQLServer
Catalog
Database
Database
Schema
Table
Table

Doris

JDBC Catalog 也支持连接另一个 Doris 数据库:
CREATE CATALOG doris_catalog PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:mysql://127.0.0.1:9030?useSSL=false",
"driver_url" = "mysql-connector-java-5.1.47.jar",
"driver_class" = "com.mysql.jdbc.Driver");
目前 JDBC Catalog 连接一个 Doris 数据库只支持用5.x版本的 JDBC jar 包。如果使用8.x JDBC jar 包,可能会出现列类型无法匹配问题。

参数说明

参数
是否必须
默认值
说明
user
-
对应数据库的用户名
password
-
对应数据库的密码
jdbc_url
-
JDBC 连接串
driver_url
-
JDBC Driver Jar 包名称*
driver_class
-
JDBC Driver Class 名称
only_specified_database
"false"
指定是否只同步指定的 database
lower_case_table_names
"false"
是否以小写的形式同步 JDBC 外部数据源的表名
include_database_list
""
当 only_specified_database=true 时,指定同步多个 database,以','分隔。db 名称是大小写敏感的
exclude_database_list
""
当 only_specified_database=true 时,指定不需要同步的多个 database,以','分割。db名称是大小写敏感的

驱动包路径

driver_url 可以通过以下三种方式指定:
1. 文件名。如 mysql-connector-java-5.1.47.jar。需将 Jar 包预先存放在 FE 和 BE 部署目录的 jdbc_drivers/ 目录下。系统会自动在这个目录下寻找。该目录的位置,也可以由 fe.conf 和 be.conf 中的 jdbc_drivers_dir 配置修改。
2. 本地绝对路径。如 file:///path/to/mysql-connector-java-5.1.47.jar。需将 Jar 包预先存放在所有 FE/BE 节点指定的路径下。
3. Http 地址。如:https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-5.1.47.jar。系统会从这个 http 地址下载 Driver 文件。仅支持无认证的 http 服务。

指定同步数据库

only_specified_database:在 jdbc 连接时可以指定链接到哪个 database/schema,如:MySQL 中 jdbc_url 中可以指定 database,pg 的 jdbc_url 中可以指定 currentSchema。
include_database_list:当 only_specified_database=true 时,指定需要同步的 database,以','分割。默认为'',即不做任何过滤,同步所有 database。db 名称是大小写敏感的
exclude_database_list:当 only_specified_database=true 时,指定不需要同步的多个 database,以','分割。默认为'',即不做任何过滤,同步所有database。db 名称是大小写敏感的。
include_database_listexclude_database_list 有重合的 database 配置时,exclude_database_list会优先生效。
如果使用该参数时连接 Oracle 数据库,要求使用 ojdbc8.jar 以上版本 jar 包。

数据查询

select * from mysql_catalog.mysql_database.mysql_table where t1 > 1000 and t2 ='term';
由于可能存在使用数据库内部的关键字作为字段名,为解决这种状况下仍能正确查询,所以在 SQL 语句中,会根据各个数据库的标准自动在字段名与表名上加上转义符。例如 MYSQL(``)、PostgreSQL("")、SQLServer([])、ORACLE(""),所以此时可能会造成字段名的大小写敏感,具体可以通过 explain sql,查看转义后下发到各个数据库的查询语句。

列类型映射

MySQL

MYSQL Type
Doris Type
Comment
BOOLEAN
BOOLEAN
-
TINYINT
TINYINT
-
SMALLINT
SMALLINT
-
MEDIUMINT
INT
-
INT
INT
-
BIGINT
BIGINT
-
UNSIGNED TINYINT
SMALLINT
Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级
UNSIGNED MEDIUMINT
INT
Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级
UNSIGNED INT
BIGINT
Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级
UNSIGNED BIGINT
LARGEINT
-
FLOAT
FLOAT
-
DOUBLE
DOUBLE
-
DECIMAL
DECIMAL
-
DATE
DATE
-
TIMESTAMP
DATETIME
-
DATETIME
DATETIME
-
YEAR
SMALLINT
-
TIME
STRING
-
CHAR
CHAR
-
VARCHAR
VARCHAR
-
TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB、TINYSTRING、STRING、MEDIUMSTRING、LONGSTRING、BINARY、VARBINARY、JSON、SET、BIT
STRING
-
Other
UNSUPPORTED
-

PostgreSQL

POSTGRESQL Type
Doris Type
Comment
boolean
BOOLEAN
-
smallint/int2
SMALLINT
-
integer/int4
INT
-
bigint/int8
BIGINT
-
decimal/numeric
DECIMAL
-
real/float4
FLOAT
-
double precision
DOUBLE
-
smallserial
SMALLINT
-
serial
INT
-
bigserial
BIGINT
-
char
CHAR
-
varchar/text
STRING
-
timestamp
DATETIME
-
date
DATE
-
time
STRING
-
interval
STRING
-
point/line/lseg/box/path/polygon/circle
STRING
-
cidr/inet/macaddr
STRING
-
bit/bit(n)/bit varying(n)
STRING
bit 类型映射为 doris 的 STRING 类型,读出的数据是 true/false,而不是1/0
uuid/JSONB
STRING
-
Other
UNSUPPORTED
-

Oracle

ORACLE Type
Doris Type
Comment
number(p) / number(p,0)
TINYINT/SMALLINT/INT/BIGINT/LARGEINT
Doris会根据p的大小来选择对应的类型:p < 3 -> TINYINT; p < 5 -> SMALLINT; p < 10 -> INT; p < 19 -> BIGINT; p > 19 -> LARGEINT
number(p,s), [ if(s>0 && p>s) ]
DECIMAL(p,s)
-
number(p,s), [ if(s>0 && p < s) ]
DECIMAL(s,s)
-
number(p,s), [ if(s<0) ]
TINYINT/SMALLINT/INT/BIGINT/LARGEINT
s<0的情况下, Doris会将p设置为 p+|s|, 并进行和number(p) / number(p,0)一样的映射
number
-
Doris 目前不支持未指定 p 和 s 的 oracle 类型
decimal
DECIMAL
-
float/real
DOUBLE
-
DATE
DATETIME
-
TIMESTAMP
DATETIME
-
CHAR/NCHAR
STRING
-
VARCHAR2/NVARCHAR2
STRING
-
LONG/ RAW/ LONG RAW/ INTERVAL
STRING
-
Other
UNSUPPORTED
-

SQLServer

SQLServer Type
Doris Type
Comment
bit
BOOLEAN
-
tinyint
SMALLINT
SQLServer 的 tinyint 是无符号数,所以映射为 Doris 的 SMALLINT
smallint
SMALLINT
-
int
INT
-
bigint
BIGINT
-
real
FLOAT
-
float
DOUBLE
-
money
DECIMAL(19,4)
-
smallmoney
DECIMAL(10,4)
-
decimal/numeric
DECIMAL
-
date
DATE
-
datetime/datetime2/smalldatetime
DATETIMEV2
-
char/varchar/text/nchar/nvarchar/ntext
STRING
-
binary/varbinary
STRING
-
time/datetimeoffset
STRING
-
Other
UNSUPPORTED
-

Clickhouse

ClickHouse Type
Doris Type
Comment
Bool
BOOLEAN
-
String
STRING
-
Date/Date32
DATEV2
Jdbc Catlog 连接 ClickHouse 时默认使用 DATEV2类型
DateTime/DateTime64
DATETIMEV2
Jdbc Catlog 连接 ClickHouse 时默认使用 DATETIMEV2类型
Float32
FLOAT
-
Float64
DOUBLE
-
Int8
TINYINT
-
Int16/UInt8
SMALLINT
Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int32/UInt16
INT
Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int64/Uint32
BIGINT
Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int128/UInt64
LARGEINT
Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int256/UInt128/UInt256
STRING
Doris 没有这个数量级的数据类型,采用 STRING 处理
DECIMAL
DECIMAL/DECIMALV3/STRING
将根据 Doris DECIMAL 字段的(precision, scale)和 enable_decimal_conversion 开关选择用何种类型
Enum/IPv4/IPv6/UUID
STRING
在显示上 IPv4,IPv6会额外在数据最前面显示一个“/”,需要自己用 split_part 函数处理
Array
ARRAY
Array 内部类型适配逻辑参考上述类型,不支持嵌套类型
Other
UNSUPPORTED
-