MySQL 连接器

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

配置

要配置 MySQL 连接器,请在 etc/catalog 中创建一个名为 mysql.properties 的目录属性文件,以将 MySQL 连接器作为 mysql 目录挂载。使用以下内容创建该文件,根据您的设置替换连接属性

connector.name=mysql
connection-url=jdbc:mysql://example.net:3306
connection-user=root
connection-password=secret

connection-url 定义了连接信息和要传递给 MySQL JDBC 驱动的参数。URL 支持的参数在 MySQL 开发者指南 中提供。

例如,以下 connection-url 允许您配置 JDBC 驱动程序以基于 UTC 解释时间值,作为服务器上的时区,并作为 已知问题的解决方法

connection-url=jdbc:mysql://example.net:3306?serverTimezone=UTC

connection-userconnection-password 通常是必需的,并确定连接的用户名和密码,通常是服务用户。

多个 MySQL 服务器

您可以根据需要创建任意数量的目录,因此如果您有额外的 MySQL 服务器,只需将另一个属性文件添加到 etc/catalog 中,并使用不同的名称(确保以 .properties 结尾)。例如,如果您将属性文件命名为 sales.properties,Presto 将使用配置的连接器创建名为 sales 的目录。

通用配置属性

属性名称

描述

默认值

user-credential-name

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

password-credential-name

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

case-insensitive-name-matching

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

false

case-insensitive-name-matching.cache-ttl

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

1m

查询 MySQL

MySQL 连接器为每个 MySQL 数据库 提供一个架构。您可以通过运行 SHOW SCHEMAS 来查看可用的 MySQL 数据库

SHOW SCHEMAS FROM mysql;

如果您有一个名为 web 的 MySQL 数据库,您可以通过运行 SHOW TABLES 来查看此数据库中的表

SHOW TABLES FROM mysql.web;

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

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

最后,您可以访问 web 数据库中的 clicks

SELECT * FROM mysql.web.clicks;

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

类型映射

PrestoDB 和 MySQL 都支持对方不支持的类型。在从 MySQL 读取或写入 MySQL 时,Presto 会将 MySQL 中的数据类型转换为等效的 Presto 数据类型,以及从 Presto 转换为等效的 MySQL 数据类型。请参阅以下部分了解每个方向的类型映射。

MySQL 到 PrestoDB 类型映射

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

MySQL 到 PrestoDB 类型映射

MySQL 类型

PrestoDB 类型

BIT

BOOLEAN

BOOLEAN

TINYINT

TINYINT

TINYINT

TINYINT UNSIGNED

TINYINT

SMALLINT

SMALLINT

SMALLINT UNSIGNED

SMALLINT

INTEGER

INTEGER

INTEGER UNSIGNED

INTEGER

BIGINT

BIGINT

BIGINT UNSIGNED

BIGINT

DOUBLE PRECISION

DOUBLE

FLOAT

REAL

REAL

DOUBLE

DECIMAL(p, s)

DECIMAL(p, s)

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

TINYTEXT

VARCHAR(255)

TEXT

VARCHAR(65535)

MEDIUMTEXT

VARCHAR(16777215)

LONGTEXT

VARCHAR

ENUM(n)

CHAR(n)

BINARY, VARBINARY, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB

VARBINARY

JSON

CHAR(n)

DATE

DATE

TIME(n)

TIME

DATETIME(n)

DATETIME

TIMESTAMP(n)

TIMESTAMP

不支持其他类型。

PrestoDB 到 MySQL 类型映射

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

PrestoDB 到 MySQL 类型映射

PrestoDB 类型

MySQL 类型

BOOLEAN

TINYINT

TINYINT

TINYINT

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

REAL

REAL

DOUBLE

DOUBLE PRECISION

DECIMAL(p, s)

DECIMAL(p, s)

CHAR(n)

CHAR(n)

VARCHAR(n)

TINYTEXT, MEDIUMTEXT

VARCHAR

LONGTEXT

DATE

DATE

TIME

TIME

TIMESTAMP

DATETIME

VARBINARY

MEDIUMBLOB

不支持其他类型。

SQL 支持

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

ALTER TABLE

ALTER TABLE mysql.web.page_views ADD COLUMN zipcode VARCHAR;
ALTER TABLE mysql.web.page_views RENAME COLUMN zipcode TO location;
ALTER TABLE mysql.web.page_views DROP COLUMN location;

CREATE TABLE

web 架构中创建一个名为 page_views 的新 MySQL 表

CREATE TABLE mysql.web.page_views (
  user_id bigint,
  page_url varchar,
  ds date,
  country varchar
);

注意

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

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

返回类似以下的错误

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

CREATE TABLE AS SELECT

从现有表 page_views 中创建一个名为 page_views_new 的新表

CREATE TABLE mysql.web.page_views_new AS SELECT * FROM mysql.web.page_views;

注意

CREATE TABLE AS SELECT 语句中不支持数据压缩等高级 SQL 功能。

CREATE TABLE compressed_employees AS SELECT * FROM employees WITH (compression = 'Zlib');

返回类似以下的错误

查询 20240321_103408_00015_kbd43 失败: 1 67 列: 输入不匹配 '('。 预期: 'DATA', 'NO'

INSERT INTO

将数据插入到 page_views 表中

INSERT INTO mysql.web.page_views VALUES(1, 'https://example.com', current_date, 'country');

SELECT

SELECT * FROM mysql.web.page_views;

TRUNCATE

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

TRUNCATE TABLE mysql.web.page_views;

MySQL 连接器限制

以下 SQL 语句不受支持