跳转至

7.4.3 PostgreSQL

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 PostgreSQL 数据库。本文档介绍如何配置 PostgreSQL 数据库连接。

1 使用须知

要连接到 PostgreSQL 数据库,您需要

  • PostgreSQL 11.x 或更高版本

  • PostgreSQL 数据库的 JDBC 驱动程序,您可以从 Maven 仓库下载最新或指定版本的 PostgreSQL JDBC 驱动程序。推荐使用 PostgreSQL JDBC Driver 42.5.x 及以上版本。

  • Doris 每个 FEBE 节点和 PostgreSQL 服务器之间的网络连接,默认端口为 5432

2 连接 PostgreSQL

SQL
1
2
3
4
5
6
7
8
CREATE CATALOG postgresql PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="secret",
    "jdbc_url" = "jdbc:postgresql://example.net:5432/postgres",
    "driver_url" = "postgresql-42.5.6.jar",
    "driver_class" = "org.postgresql.Driver"
)

Tip

jdbc_url 定义要传递给 PostgreSQL JDBC 驱动程序的连接信息和参数。支持的 URL 的参数可在 PostgreSQL JDBC 驱动程序文档中找到。

2.1 连接安全

如果您使用数据源上安装的全局信任证书配置了 TLS ,则可以通过将参数附加到在 jdbc_url 属性中设置的 JDBC 连接字符串来启用集群和数据源之间的 TLS

例如,对于版本 42PostgreSQL JDBC 驱动程序,通过将 ssl=true 参数添加到 jdbc_url 配置属性中启用 TLS

Bash
1
"jdbc_url"="jdbc:postgresql://example.net:5432/database?ssl=true"

有关 TLS 配置选项的更多信息,请参阅 PostgreSQL JDBC 驱动程序文档。

3 层级映射

映射 PostgreSQL 时, Doris 的一个 Database 对应于 PostgreSQL 中指定 database 下的一个 Schema (如示例中 jdbc_url 参数中 postgres 下的 schemas )。而 DorisDatabase 下的 Table 则对应于 PostgreSQL 中,该 Schema 下的 Tables 。即映射关系如下:

Doris PostgreSQL
Catalog Database
Database Schema
Table Table

4 类型映射

4.1 PostgreSQL 到 Doris 类型映射

PostgreSQL Type Doris Type
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/timestampz DATETIME
date DATE
json/jsonb STRING
time STRING
interval STRING
point/line/lseg/box/path/polygon/circle STRING
cidr/inet/macaddr STRING
bit BOOLEAN/STRING
uuid STRING
Other UNSUPPORTED

Tip

  • 无精度 numeric 会被映射为 String 类型,进行数值计算时需要先转换为 DECIMAL 类型,且不支持回写。

  • 为了更好的读取与计算性能均衡, Doris 会将 JSON 类型映射为 STRING 类型。

  • Doris 不支持 BIT 类型, BIT 类型会在 BIT(1) 时被映射为 BOOLEAN ,其他情况下映射为 STRING

  • Doris 不支持 time 类型, TIME 类型会被映射为 STRING

4.2 时间戳类型处理

由于 Doris 不支持带时区的时间戳类型,所以在读取 PostgreSQLtimestampz 类型时, Doris 会将其映射为 DATETIME 类型,且会在读取时转换成本地时区的时间。

且由于在 JDBC 类型 Catalog 读取数据时, BEJava 部分使用 JVM 时区。 JVM 时区默认为 BE 部署机器的时区,这会影响 JDBC 读取数据时的时区转换。

为了确保时区一致性,建议在 be.confJAVA_OPTS 中设置 JVM 时区与 Doris sessiontime_zone 一致。

5 查询优化

5.1 谓词下推

当执行类似于 where dt = '2022-01-01' 这样的查询时, Doris 能够将这些过滤条件下推到外部数据源,从而直接在数据源层面排除不符合条件的数据,减少了不必要的数据获取和传输。这大大提高了查询性能,同时也降低了对外部数据源的负载。

5.2 行数限制

如果在查询中带有 limit 关键字, Doris 会将 limit 下推到 PostgreSQL ,以减少数据传输量。

5.3 转义字符

Doris 会在下发到 PostgreSQL 的查询语句中,自动在字段名与表名上加上转义符: ("") ,以避免字段名与表名与 PostgreSQL 内部关键字冲突。