MySQL Connector

MySQLコネクタを使用すると、外部MySQLデータベース内のテーブルのクエリと作成が可能です。これにより、MySQLとHive、または2つの異なるMySQLインスタンス間など、異なるシステム間のデータ結合に使用できます。

設定

MySQLコネクタを設定するには、例としてmysql.propertiesという名前でetc/catalogにカタログプロパティファイルを作成し、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を使用すると、サーバー上のタイムゾーンとしてUTCに基づいて時間値を解釈するようにJDBCドライバを設定でき、既知の問題の回避策として機能します。

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

connection-userconnection-passwordは通常必要であり、接続のユーザー資格情報(多くの場合、サービスユーザー)を決定します。

複数のMySQLサーバー

必要な数のカタログを持つことができます。そのため、追加のMySQLサーバーがある場合は、.propertiesで終わる別の名前で(etc/catalogに)別のプロパティファイルを追加するだけです。たとえば、プロパティファイルに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
    );

は、次のようなエラーを返します。

クエリ 20240322_095447_00010_syzb3 失敗: 2行目19文字目: 入力 'PRIMARY' が一致しません。 期待される入力: ')', ','

CREATE TABLE AS SELECT

既存テーブルpage_viewsから新しいテーブルpage_views_newを作成します。

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

注記

データ圧縮などの高度なSQL機能は、CREATE TABLE AS SELECT文ではサポートされていません。

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文はサポートされていません。