PostgreSQL 连接器

PostgreSQL 连接器允许查询和创建外部 PostgreSQL 数据库中的表。这可以用来连接不同系统(如 PostgreSQL 和 Hive)之间的数据,或连接两个不同的 PostgreSQL 实例之间的数据。

配置

要配置 PostgreSQL 连接器,请在 etc/catalog 中创建一个名为(例如)postgresql.properties 的目录属性文件,以将 PostgreSQL 连接器装载为 postgresql 目录。使用以下内容创建文件,根据您的设置替换连接属性

connector.name=postgresql
connection-url=jdbc:postgresql://example.net:5432/database
connection-user=root
connection-password=secret

多个 PostgreSQL 数据库或服务器

PostgreSQL 连接器只能访问 PostgreSQL 服务器中的单个数据库。因此,如果您有多个 PostgreSQL 数据库,或者想要连接到多个 PostgreSQL 服务器,您必须配置 PostgreSQL 连接器的多个实例。

要添加另一个目录,只需在 etc/catalog 中添加另一个名称不同的属性文件(确保它以 .properties 结尾)。例如,如果您将属性文件命名为 sales.properties,Presto 将使用配置的连接器创建名为 sales 的目录。

通用配置属性

属性名称

描述

默认值

user-credential-name

extraCredentials 属性的名称,其值为 JDBC 驱动程序的用户名。请参阅 参数参考 中的 extraCredentials

password-credential-name

extraCredentials 属性的名称,其值为 JDBC 驱动程序的用户密码。请参阅 参数参考 中的 extraCredentials

case-insensitive-name-matching

不区分大小写地匹配数据集和表名。

false

case-insensitive-name-matching.cache-ttl

远程数据集和表名将被缓存的持续时间。设置为 0ms 以禁用缓存。

1m

查询 PostgreSQL

PostgreSQL 连接器为每个 PostgreSQL 模式提供一个模式。您可以通过运行 SHOW SCHEMAS 来查看可用的 PostgreSQL 模式。

SHOW SCHEMAS FROM postgresql;

如果您有一个名为 web 的 PostgreSQL 模式,您可以通过运行 SHOW TABLES 来查看此模式中的表。

SHOW TABLES FROM postgresql.web;

您可以使用以下任一方法查看 web 数据库中 clicks 表的列列表:

DESCRIBE postgresql.web.clicks;
SHOW COLUMNS FROM postgresql.web.clicks;

最后,您可以访问 web 模式中的 clicks 表:

SELECT * FROM postgresql.web.clicks;

如果您使用不同的名称为您的目录属性文件命名,请在上面的示例中使用该目录名称代替 postgresql

类型映射

PrestoDB 和 PostgreSQL 都支持对方不支持的类型。当从 PostgreSQL 读取或写入 PostgreSQL 时,Presto 会将数据类型从 PostgreSQL 转换为等效的 Presto 数据类型,以及从 Presto 转换为等效的 PostgreSQL 数据类型。

PostgreSQL 到 PrestoDB 类型映射

连接器将 PostgreSQL 类型映射到相应的 PrestoDB 类型

PostgreSQL 到 PrestoDB 类型映射

PostgreSQL 类型

PrestoDB 类型

BIT

BOOLEAN

BOOLEAN

BOOLEAN

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

DOUBLE PRECISION

DOUBLE

REAL

REAL

NUMERIC(p, s)

DECIMAL(p, s)

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

ENUM

VARCHAR

BYTEA

VARBINARY

DATE

DATE

TIME

TIME

TIMESTAMP

TIMESTAMP

TIMESTAMPTZ

TIMESTAMP

MONEY

DOUBLE

UUID

UUID

JSON

JSON

JSONB

JSON

不支持其他类型。

PrestoDB 到 PostgreSQL 类型映射

连接器将 PrestoDB 类型映射到相应的 PostgreSQL 类型

PrestoDB 到 PostgreSQL 类型映射

PrestoDB 类型

PostgreSQL 类型

BOOLEAN

BOOLEAN

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

DOUBLE

DOUBLE PRECISION

DECIMAL(p, s)

NUMERIC(p, s)

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

VARBINARY

BYTEA

DATE

DATE

TIME

TIME

TIMESTAMP

TIMESTAMP

UUID

UUID

不支持其他类型。

包含不支持列的表

如果您使用 Presto 连接器查询 PostgreSQL 表,并且该表要么没有支持的列,要么只包含不支持的数据类型,Presto 将返回类似于以下示例的错误。

Query 20231120_102910_00004_35dqb failed: Table 'public.unsupported_type_table' has no supported columns (all 1 columns are not supported).

SQL 支持

PostgreSQL 连接器允许查询和创建表。以下是一些支持的 SQL 操作示例

ALTER TABLE

ALTER TABLE postgresql.public.sample_table ADD COLUMN new_col INT;
ALTER TABLE postgresql.public.sample_table DROP COLUMN new_col;
ALTER TABLE postgresql.public.sample_table RENAME COLUMN is_active TO is_enabled;
ALTER TABLE postgresql.public.sample_table RENAME TO renamed_table;

注意

Presto 不支持使用 ALTER TABLE 命令直接更改列的数据类型。

ALTER TABLE postgresql.public.users ALTER COLUMN age TYPE BIGINT;

返回类似于以下的错误。

Query 20240322_091317_00007_syzb3 failed: line 1:19: mismatched input 'ALTER'. Expecting: 'FUNCTION', 'SCHEMA', 'TABLE'

CREATE TABLE

public 模式中创建一个名为 test_integer 的新表。

CREATE TABLE postgresql.public.test_integer ( id INTEGER );

注意

Presto 不强制执行主键约束。例如,以下语句

CREATE TABLE users (
        id INT PRIMARY KEY,
        name VARCHAR,
        email VARCHAR
    );

返回类似于以下的错误。

Query 20240322_095447_00010_syzb3 failed: line 2:19: mismatched input 'PRIMARY'. Expecting: ')', ','

CREATE TABLE AS SELECT

从现有表 renamed_table 创建一个名为 new_table 的新表。

CREATE TABLE postgresql.public.new_table AS SELECT * FROM postgresql.public.renamed_table;

DESCRIBE

要查看web数据库中clicks表的列列表,请使用以下任一方法

DESCRIBE postgresql.web.clicks;
SHOW COLUMNS FROM postgresql.web.clicks;

INSERT INTO

将数据插入renamed_table

INSERT INTO postgresql.public.renamed_table (id, name) VALUES (1, 'Test');

SELECT

SELECT * FROM postgresql.public.test_integer;

SHOW SCHEMAS

查看可用的PostgreSQL模式

SHOW SCHEMAS FROM postgresql;

SHOW TABLES

查看名为web的PostgreSQL模式中的表

SHOW TABLES FROM postgresql.web;

TRUNCATE

删除表renamed_table中的所有数据,但不删除表本身

TRUNCATE TABLE postgresql.public.renamed_table;

PostgreSQL连接器限制

不支持以下SQL语句