Amazon Athena Redshift コネクタ - Amazon Athena

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Athena Redshift コネクタ

Amazon Athena Redshift コネクタは、Amazon Athena での Amazon Redshift データベースへのアクセスを可能にします。

前提条件

制限事項

  • DDL の書き込みオペレーションはサポートされていません。

  • マルチプレクサの設定では、スピルバケットとプレフィックスが、すべてのデータベースインスタンスで共有されます。

  • 関連性のある Lambda 上限値。詳細については、AWS Lambda デベロッパーガイドLambda のクォータを参照してください。

  • Redshift は外部パーティションをサポートしていないため、クエリで指定されたすべてのデータが毎回取得されます。

規約

Redshift コネクタに関連する用語を次に示します。

  • データベースインスタンス – オンプレミス、Amazon EC2、または Amazon RDS にデプロイされたデータベースの任意のインスタンス。

  • ハンドラー – データベースインスタンスにアクセスする Lambda ハンドラー。ハンドラーには、メタデータ用とデータレコード用があります。

  • メタデータハンドラー – データベースインスタンスからメタデータを取得する Lambda ハンドラー。

  • レコードハンドラー – データベースインスタンスからデータレコードを取得する Lambda ハンドラー。

  • 複合ハンドラー — データベースインスタンスからメタデータとデータレコードの両方を取得する Lambda ハンドラー。

  • プロパティまたはパラメータ – ハンドラーがデータベース情報を抽出するために使用するデータベースプロパティ。これらのプロパティは Lambda の環境変数で設定します。

  • 接続文字列 – データベースインスタンスへの接続を確立するために使用されるテキスト文字列。

  • カタログ – Athena に登録された AWS Glue ではないカタログ。これは、connection_string プロパティに必須のプレフィックスです。

  • マルチプレックスハンドラー – 複数のデータベース接続を受け入れて使用することが可能な Lambda ハンドラー。

パラメータ

このセクションの Lambda 環境変数を使用して Redshift コネクタを設定します。

接続文字列

次の形式の JDBC 接続文字列を使用して、データベースインスタンスに接続します。

redshift://${jdbc_connection_string}

マルチプレックスハンドラーの使用

マルチプレクサーを使用すると、単一の Lambda 関数から複数のデータベースインスタンスに接続できます。各リクエストはカタログ名によりルーティングされます。Lambda では以下のクラスを使用します。

Handler Class
複合ハンドラー RedshiftMuxCompositeHandler
メタデータハンドラー RedshiftMuxMetadataHandler
レコードハンドラー RedshiftMuxRecordHandler

マルチプレックスハンドラーのパラメータ

パラメータ 説明
$catalog_connection_string 必須。データベースインスタンスの接続文字列。環境変数には、Athena で使用されているカタログの名前をプレフィックスします。例えば、Athena に登録されたカタログが myredshiftcatalog の場合、環境変数の名前は myredshiftcatalog_connection_string になります。
default 必須。デフォルトの接続文字列。この文字列は、カタログが lambda:${AWS_LAMBDA_FUNCTION_NAME} の場合に使用されます。

redshift1 (デフォルト) と redshift2 の 2 つのデータベースインスタンスをサポートする Redshift MUX Lambda 関数用のプロパティを次に示します。

プロパティ
default redshift://jdbc:redshift://redshift1.host:5439/dev?user=sample2&password=sample2
redshift_catalog1_connection_string redshift://jdbc:redshift://redshift1.host:3306/default?${Test/RDS/Redshift1}
redshift_catalog2_connection_string redshift://jdbc:redshift://redshift2.host:3333/default?user=sample2&password=sample2

認証情報の提供

JDBC 接続文字列の中でデータベースのユーザー名とパスワードを指定するには、接続文字列のプロパティ、もしくは AWS Secrets Manager を使用します。

  • 接続文字列 – ユーザー名とパスワードを、JDBC 接続文字列のプロパティとして指定できます。

    重要

    セキュリティ上のベストプラクティスとして、環境変数や接続文字列にハードコードされた認証情報を使用しないでください。ハードコードされたシークレットを AWS Secrets Manager に移動する方法については、「AWS Secrets Manager ユーザーガイド」の「ハードコードされたシークレットを AWS Secrets Manager に移動する」を参照してください。

  • AWS Secrets Manager – Athena の横串検索機能を AWS Secrets Manager で使用するには、Secrets Manager に接続するためのインターネットアクセスまたは VPC エンドポイントが、Lambda 関数に接続されている VPC に必要です。

    JDBC 接続文字列には、AWS Secrets Manager のシークレットの名前を含めることができます。コネクタは、このシークレット名を Secrets Manager の username および password の値に置き換えます。

    Amazon RDS データベースインスタンスには、このサポートが緊密に統合されています。Amazon RDS を使用している場合は、AWS Secrets Manager と認証情報ローテーションの使用を強くお勧めします。データベースで Amazon RDS を使用していない場合は、認証情報を次の形式で JSON として保存します。

    {"username": "${username}", "password": "${password}"}
シークレット名を含む接続文字列の例

次の文字列はシークレット名 ${Test/RDS/ Redshift1} を含んでいます。

redshift://jdbc:redshift://redshift1.host:3306/default?...&${Test/RDS/Redshift1}&...

次の例のように、コネクタはシークレット名を使用し、シークレットを取得してユーザー名とパスワードを提供します。

redshift://jdbc:redshift://redshift1.host:3306/default?...&user=sample2&password=sample2&...

現在、Redshift コネクタは userpassword の JDBC プロパティを認識します。

スピルパラメータ

Lambda SDK は Amazon S3 にデータをスピルする可能性があります。同一の Lambda 関数によってアクセスされるすべてのデータベースインスタンスは、同じ場所にスピルします。

パラメータ 説明
spill_bucket 必須。スピルバケット名。
spill_prefix 必須。スピルバケットのキープレフィックス
spill_put_request_headers (オプション) スピルに使用される Amazon S3 の putObject リクエスト (例:{"x-amz-server-side-encryption" : "AES256"}) における、リクエストヘッダーと値に関する JSON でエンコードされたマッピング。利用可能な他のヘッダーについては、「Amazon Simple Storage Service API リファレンス」の「PutObject」を参照してください。

サポートされるデータ型

次の表に、JDBC と Apache Arrow に対応するデータ型を示します。

JDBC Arrow
ブール値 Bit
整数 Tiny
ショート Smallint
整数 Int
Long Bigint
フロート Float4
ダブル Float8
日付 DateDay
タイムスタンプ DateMilli
文字列 Varchar
バイト Varbinary
BigDecimal 10 進数
配列 リスト

パーティションと分割

Redshift は外部パーティションをサポートしていません。パフォーマンス関連の問題については、「パフォーマンス」を参照してください。

パフォーマンス

Athena Redshift コネクタは述語のプッシュダウンを実行して、クエリによってスキャンされるデータを減少させます。スキャンされるデータ量を削減し、クエリ実行のランタイムを短縮するために、LIMIT 句、ORDER BY 句、単純な述語、および複雑な式はコネクタにプッシュダウンされます。ただし、列のサブセットを選択すると、クエリのランタイムが長くなる場合があります。Amazon Redshift は、複数のクエリを同時に実行すると、特にクエリの実行速度が低下しやすくなります。

LIMIT 句

LIMIT N ステートメントにより、クエリによってスキャンされるデータが削減されます。LIMIT N プッシュダウンを使用すると、コネクタは N 行のみを Athena に返します。

上位 N 件のクエリ

上位 N 件のクエリは、結果セットの順序と返される行数に対する制限を指定します。このタイプのクエリを使用して、データセットの上位 N 個の最大値または上位 N 個の最小値を決定できます。上位 N 件のプッシュダウンを使用すると、コネクタは N 件の順序付けられた行のみを Athena に返します。

述語

述語は、ブール値に照らして評価し、複数の条件に基づいて行をフィルタリングする SQL クエリの WHERE 句内の式です。Athena Redshift コネクタは、これらの式を組み合わせて Redshift に直接プッシュすることで、機能を強化し、スキャンされるデータ量を削減できます。

次の Athena Redshift コネクタ演算子は、述語のプッシュダウンをサポートしています。

  • ブーリアン: AND、OR、NOT

  • 等値: EQUAL、NOT_EQUAL、LESS_THAN、LESS_THAN_OR_EQUAL、GREATER_THAN、GREATER_THAN_OR_EQUAL、IS_DISTINCT_FROM、NULL_IF、IS_NULL

  • Arithmetic: ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE

  • その他: LIKE_PATTERN、IN

組み合わせたプッシュダウンの例

クエリ機能を強化するには、次の例のようにプッシュダウンタイプを組み合わせます。

SELECT * FROM my_table WHERE col_a > 10 AND ((col_a + col_b) > (col_c % col_d)) AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') ORDER BY col_a DESC LIMIT 10;

Amazon Redshift などのフェデレーテッドクエリのパフォーマンスを向上させるために述語プッシュダウンを使用する方法の記事については、AWS Big Data Blog の「Improve federated queries with predicate pushdown in Amazon Athena」を参照してください。

以下も参照してください。

最新の JDBC ドライバーのバージョン情報については、GitHub.com の Redshift コネクタ用の pom.xml ファイルを参照してください。

このコネクタに関するその他の情報については、GitHub.com で対応するサイトを参照してください。