

# Redshift 接続
<a name="aws-glue-programming-etl-connect-redshift-home"></a>

AWS Glue for Spark を使用して Amazon Redshift データベース内のテーブルに対する読み込みと書き込みを行うことができます。AWS Glue は Amazon Redshift SQL の `COPY` および `UNLOAD` コマンドを使用して、Amazon S3 を介してデータを移動し、スループットを最大化します。AWS Glue 4.0 以降では、[Apache Spark 用の Amazon Redshift インテグレーション](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html)を使用して、Amazon Redshift 固有の最適化と機能を使用して読み込みと書き込みを行うことができます。また、以前のバージョンで接続する場合には利用できなかった機能もあります。

AWS Glue によって Amazon Redshift ユーザーがサーバーレスデータ統合と ETL のための AWS Glue への移行がこれまでになく簡単になった方法をご覧ください。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/ZapycBq8TKU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/ZapycBq8TKU)


## Redshift 接続の設定
<a name="aws-glue-programming-etl-connect-redshift-configure"></a>

AWS Glue で Amazon Redshift クラスターを使用するには、いくつかの前提条件が必要です。
+ データベースの読み込みおよび書き込み時に一時的なストレージとして使用する Amazon S3 ディレクトリがあること。
+ Amazon Redshift クラスター、AWS Glue ジョブ、Amazon S3 ディレクトリ間の通信を可能にする Amazon VPC があること。
+ AWS Glue ジョブと Amazon Redshift クラスターに対する適切な IAM アクセス許可があること。

### IAM ロールを設定する
<a name="aws-glue-programming-etl-redshift-config-iam"></a>

**Amazon Redshift クラスターのロールを設定する**  
AWS Glue ジョブと統合するため、Amazon Redshift クラスターによる Amazon S3 への読み取りおよび書き込みが可能である必要があります。これを可能にするには、接続する Amazon Redshift クラスターに IAM ロールを関連付けます。ロールには、Amazon S3 の一時ディレクトリからの読み取り、および一時ディレクトリへの書き込みを許可するポリシーが必要です。ロールには、`redshift.amazonaws.com` サービスで `AssumeRole` を許可する信頼関係が必要です。

**IAM ロールを Amazon Redshift に関連付けるには**

1. **前提条件:** ファイルの一時的なストレージとして使用する Amazon S3 バケットまたはディレクトリがあること。

1. Amazon Redshift クラスターに必要な Amazon S3 のアクセス許可を特定します。Amazon Redshift クラスターとの間でデータを移動する場合、AWS Glue ジョブは Amazon Redshift に対して COPY および UNLOAD ステートメントを発行します。ジョブによって Amazon Redshift のテーブルが変更された場合、AWS Glue は CREATE LIBRARY ステートメントも発行します。Amazon Redshift がこれらのステートメントを実行するために必要な特定の Amazon S3 のアクセス許可については、Amazon Redshift のドキュメント「[Amazon Redshift: 他の AWS リソースにアクセスするアクセス許可](https://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-access-permissions.html)」を参照してください。

1. IAM コンソールで、必要なアクセス許可を持つ IAM ポリシーを作成します。ポリシーの作成についての詳細は、[IAM ポリシーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) を参照してください。

1. IAM コンソールで、ロールと信頼関係を作成し、Amazon Redshift がロールを継承できるようにします。これについては、IAM のドキュメントにある [AWS のサービス用ロールの作成 (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console) の手順に従ってください。
   + AWS サービスのユースケースを選択するように求められた場合、[Redshift - カスタマイズ可能] を選択します。
   + ポリシーをアタッチするように求められた場合、以前に定義したポリシーを選択します。
**注記**  
Amazon Redshiftのロールの詳細については、Amazon Redshift のドキュメントの「[ユーザーに代わって Amazon Redshift が他の AWS サービスにアクセスすることを許可する](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)」を参照してください。

1. Amazon Redshift コンソールで、ロールを Amazon Redshift クラスターに関連付けます。これについては、[Amazon Redshift のドキュメント](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)に記載されている手順に従ってください。

   Amazon Redshift コンソールでハイライト表示されているオプションを選択して、この設定を行えます。  
![\[Amazon Redshift コンソールで IAM アクセス許可を管理する場所の例。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/RS-role-config.png)

**注記**  
 AWS Glue はデフォルトで、ジョブを実行するために指定したロールを使用して作成された、Amazon Redshift の一時的な認証情報を渡します。これらの認証情報を使用することはお勧めしません。これらの認証情報は、セキュリティ上の理由により 1 時間後に失効します。

**AWS Glue ジョブのロールを設定する**  
AWS Glue ジョブには Amazon S3 バケットにアクセスするためのロールが必要です。Amazon Redshift クラスターの IAM アクセス許可は必要ありません。アクセスは Amazon VPC の接続とデータベースの認証情報によって制御されます。

### Amazon VPC を設定する
<a name="aws-glue-programming-etl-redshift-config-vpc"></a>

**Amazon Redshift データストアへのアクセスをセットアップするには**

1. AWS マネジメントコンソール にサインインして、[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/) で Amazon Redshift コンソールを開きます。

1. 左のナビゲーションペインで、**[Clusters (クラスター)]** を選択してください。

1. AWS Glue からアクセスするクラスターの名前を選択します。

1. [**Cluster Properties (クラスターのプロパティ)**] セクションで、[**VPC security groups (VPC セキュリティグループ)**] 内のセキュリティグループを選択し、AWS Glue が使用できるようにします。今後の参照用に選択したセキュリティグループの名前を記録します。Amazon EC2 コンソールでセキュリティグループを選択すると、[**Security Groups**] (セキュリティグループ) の一覧が開きます。

1. 変更するセキュリティグループを選択し、[**Inbound (インバウンド)**] タブに移動します。

1. 自己参照ルールを追加して、AWS Glue コンポーネントが通信できるようにします。具体的には、[**Type (タイプ)**] `All TCP`、[**Protocol (プロトコル)**] は `TCP`、[**Port Range (ポート範囲)**] にはすべてのポートが含まれ、[**Source (ソース)**] は [**Group ID (グループ ID)**] と同じセキュリティグループ名であるというルールを追加または確認します。

   インバウンドルールは以下のようになります。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-connect-redshift-home.html)

   例:   
![\[自己参照のインバウンドルールの例。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/SetupSecurityGroup-Start.png)

1. アウトバウンドトラフィックのルールも追加します。すべてのポートへのアウトバウンドトラフィックを開きます。以下に例を示します。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-connect-redshift-home.html)

   または、[**Type (タイプ)**] は `All TCP`、[**Protocol (プロトコル)**] は `TCP`、[**Port Range (ポート範囲)**] にすべてのポートが含まれ、[**Destination (宛先)**] は [**Group ID (グループ ID)**] と同じセキュリティグループ名の自己参照ルールを作成します。Amazon S3 VPC エンドポイントを使用している場合は、Amazon S3 にアクセスするための HTTPS ルールも追加します。セキュリティグループルールには、VPC から Amazon S3 VPC エンドポイントへのトラフィックを許可するために、*s3-prefix-list-id* が必要です。

   例:   
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-connect-redshift-home.html)

### AWS Glue をセットアップ
<a name="aws-glue-programming-etl-redshift-config-glue"></a>

Amazon VPC 接続情報を提供する AWS Glue データカタログ接続を作成する必要があります。

**コンソールで AWS Glue への Amazon Redshift Amazon VPC 接続を設定するには**

1. 「[AWS Glue 接続の追加](console-connections.md)」のステップに従ってデータカタログ接続を作成します。接続を作成したら、次のステップのために接続名 *connectionName* を保存しておきます。
   + **接続タイプ**を選択するときは、**Amazon Redshift** を選択します。
   + **Redshift クラスター**を選択するときは、クラスターを名前で選択します。
   + クラスターの Amazon Redshift ユーザーのデフォルト接続情報を指定します。
   + Amazon VPC 設定は自動的に設定されます。
**注記**  
AWS SDK を使用して **Amazon Redshift** 接続を作成する場合は、Amazon VPC の `PhysicalConnectionRequirements` を手動で指定する必要があります。

1. AWS Glue ジョブ設定で、**追加のネットワーク接続**として *connectionName* を指定します。

## 例: Amazon Redshift テーブルからの読み取り
<a name="aws-glue-programming-etl-connect-redshift-read"></a>

 Amazon Redshift クラスターと Amazon Redshift Serverless 環境から読み込みを行うことができます。

**前提条件:** 読み込む目的の Amazon Redshift テーブルがあること。前のセクション [Redshift 接続の設定](#aws-glue-programming-etl-connect-redshift-configure) の手順を実行してください。実行後に、一時ディレクトリ *temp-s3-dir* および IAM ロール *rs-role-name* 用の Amazon S3 URI が用意されるはずです (*role-account-id* アカウント内)。

------
#### [ Using the Data Catalog ]

**その他の前提条件:** 読み取る目的の Amazon Redshift テーブル用のテーブルとデータカタログのデータベースがあること。データカタログの詳細については、[AWS Glue でのデータ検出とカタログ化](catalog-and-crawler.md) を参照してください。Amazon Redshift テーブルのエントリを作成したら、*redshift-dc-database-name* および *redshift-table-name* を使用して接続を識別します。

**設定:** 関数オプションで、`database` および `table_name` パラメータを使用してデータカタログテーブルを識別します。`redshift_tmp_dir` を使用して、Amazon S3 の一時ディレクトリを識別します。また、`additional_options` パラメータの `aws_iam_role` キーを使用して、*rs-role-name* を指定します。

```
 glueContext.create_dynamic_frame.from_catalog(
    database = "redshift-dc-database-name", 
    table_name = "redshift-table-name", 
    redshift_tmp_dir = args["temp-s3-dir"], 
    additional_options = {"aws_iam_role": "arn:aws:iam::role-account-id:role/rs-role-name"})
```

------
#### [ Connecting directly ]

**その他の前提条件:** Amazon Redshift テーブルの名前 (*redshift-table-name*) が必要です。そのテーブルを格納する Amazon Redshift クラスターの JDBC 接続情報が必要です。*host*、*port*、*redshift-database-name*、*username*、*password* で接続情報を入力します。

Amazon Redshift クラスターを操作するときは、Amazon Redshift コンソールから接続情報を取得できます。Amazon Redshift サーバーレスを使用する場合は、Amazon Redshift ドキュメントの「[Amazon Redshift Serverless への接続](https://docs.aws.amazon.com//redshift/latest/mgmt/serverless-connecting.html)」を参照してください。

**設定:** 関数オプションでは、`url`、`dbtable`、`user` および `password` を使用して接続パラメータを識別します。`redshift_tmp_dir` を使用して、Amazon S3 の一時ディレクトリを識別します。`from_options` を使用する場合は、`aws_iam_role` を使用して IAM ロールを指定できます。この構文はデータカタログを介して接続するのと似ていますが、`connection_options` マップにパラメータを配置します。

パスワードを AWS Glue のスクリプトにハードコードする方法は、好ましくありません。SDK for Python (Boto3) を使用して AWS Secrets Manager にパスワードを保存し、スクリプトで取得することを検討してください。

```
my_conn_options = {  
    "url": "jdbc:redshift://host:port/redshift-database-name",
    "dbtable": "redshift-table-name",
    "user": "username",
    "password": "password",
    "redshiftTmpDir": args["temp-s3-dir"],
    "aws_iam_role": "arn:aws:iam::account id:role/rs-role-name"
}

df = glueContext.create_dynamic_frame.from_options("redshift", my_conn_options)
```

------

## 例: Amazon Redshift テーブルへの書き込み
<a name="aws-glue-programming-etl-connect-redshift-write"></a>

 Amazon Redshift クラスターと Amazon Redshift Serverless 環境に書き込みを行うことができます。

**前提条件:** Amazon Redshift クラスターがあり、前のセクション「[Redshift 接続の設定](#aws-glue-programming-etl-connect-redshift-configure)」の手順を実行すること。実行後に、一時ディレクトリ *temp-s3-dir* および IAM ロール *rs-role-name* 用の Amazon S3 URI が用意されるはずです (*role-account-id* アカウント内)。また、データベースに書き込むコンテンツがある `DynamicFrame` も必要です。

------
#### [ Using the Data Catalog ]

**その他の前提条件** Amazon Redshift クラスター用のデータカタログのデータベースと、読み取る目的のテーブルがあること。データカタログの詳細については、[AWS Glue でのデータ検出とカタログ化](catalog-and-crawler.md) を参照してください。*redshift-dc-database-name* を使用して接続を識別し、*redshift-table-name* を使用してターゲットテーブルを識別します。

**設定:** 関数オプションで、`database` パラメータを使用してデータカタログのデータベースを識別し、`table_name` を使用してテーブルを指定します。`redshift_tmp_dir` を使用して、Amazon S3 の一時ディレクトリを識別します。また、`additional_options` パラメータの `aws_iam_role` キーを使用して、*rs-role-name* を指定します。

```
 glueContext.write_dynamic_frame.from_catalog(
    frame = input dynamic frame, 
    database = "redshift-dc-database-name", 
    table_name = "redshift-table-name", 
    redshift_tmp_dir = args["temp-s3-dir"], 
    additional_options = {"aws_iam_role": "arn:aws:iam::account-id:role/rs-role-name"})
```

------
#### [ Connecting through a AWS Glue connection ]

`write_dynamic_frame.from_options` メソッドを使用して、Amazon Redshift に直接接続できます。ただし、接続の詳細をスクリプトに直接挿入するのではなく、`from_jdbc_conf` メソッドを使用してデータカタログの接続に保存されている接続の詳細を参照します。これは、データベースのデータカタログテーブルをクロールまたは作成することなく実行できます。データカタログの接続ついての詳細は、[データへの接続](glue-connections.md) を参照してください。

**その他の前提条件:** データベース用のデータカタログの接続と、読み取る目的の Amazon Redshift テーブルがあること。

**設定:** *dc-connection-name* を使用して、データカタログの接続を識別します。*redshift-table-name* および *redshift-database-name* を使用して、Amazon Redshift のデータベースおよびテーブルを識別します。`catalog_connection` を使用してデータカタログの接続情報を指定し、`dbtable` および `database` を使用して Amazon Redshift の情報を指定します。この構文はデータカタログを介して接続するのと似ていますが、`connection_options` マップにパラメータを配置します。

```
my_conn_options = {
    "dbtable": "redshift-table-name",
    "database": "redshift-database-name",
    "aws_iam_role": "arn:aws:iam::role-account-id:role/rs-role-name"
}

glueContext.write_dynamic_frame.from_jdbc_conf(
    frame = input dynamic frame, 
    catalog_connection = "dc-connection-name", 
    connection_options = my_conn_options, 
    redshift_tmp_dir = args["temp-s3-dir"])
```

------

## Amazon Redshift 接続のオプションに関するリファレンス
<a name="w2aac67c11c24b8c21c15"></a>

`url`、`user` および `password` などの情報を設定するため、AWS Glue の JDBC 接続に使用される基本的な接続オプションはすべて、全 JDBC タイプで共通しています。JDBC のパラメータの詳細については、[JDBC 接続オプションのリファレンス](aws-glue-programming-etl-connect-jdbc-home.md#aws-glue-programming-etl-connect-jdbc) を参照してください。

Amazon Redshift 接続のタイプには、その他の接続オプションがいくつかあります。
+ `"redshiftTmpDir"`: (必須) データベースからコピーする際に一時的なデータをステージングできる Amazon S3 パス。
+ `"aws_iam_role"`: (オプション) IAM ロールの ARN。AWS Glue ジョブはこのロールを Amazon Redshift クラスターに渡し、ジョブの手順を完了するために必要なアクセス許可をクラスターに付与します。

### AWS Glue 4.0 以降で利用可能なその他の接続オプション
<a name="aws-glue-programming-etl-redshift-enhancements"></a>

新しい Amazon Redshift コネクタのオプションを、AWS Glue の接続オプションを介して渡すこともできます。サポートされているコネクタオプションの詳細なリストについては、[Apache Spark 用の Amazon Redshift の統合](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) の *Spark SQL パラメータ* セクションを参照してください。

参考までに、いくつかの新しいオプションをここで再度確認します。


| 名前 | 必須 | デフォルト | 説明  | 
| --- | --- | --- | --- | 
|  autopushdown  | なし | TRUE |  SQL オペレーションの Spark 論理プランをキャプチャして分析することにより、述語とクエリのプッシュダウンを適用します。オペレーションは SQL クエリに変換され、Amazon Redshift で実行されることでパフォーマンスが向上します。  | 
|  autopushdown.s3\$1result\$1cache  | いいえ | FALSE |  SQL クエリをキャッシュして Amazon S3 パスマッピングのデータをメモリにアンロードします。これにより、同じクエリを同じ Spark セッションで再度実行する必要がなくなります。`autopushdown` が有効な場合のみサポートされます。  | 
|  unload\$1s3\$1format  | いいえ | [PARQUET] |  PARQUET - クエリ結果をパーケット形式でアンロードします。 TEXT - クエリ結果をパイプ区切りのテキスト形式でアンロードします。  | 
|  sse\$1kms\$1key  | いいえ | 該当なし |  AWS のデフォルトの暗号化の代わりに `UNLOAD` オペレーション中の暗号化に使用する AWS SSE-KMS キー。  | 
|  extracopyoptions  | いいえ | 該当なし |  データロード時に Amazon Redshift `COPY` コマンドに付加する追加オプション (`TRUNCATECOLUMNS`、`MAXERROR n` など) のリスト (その他のオプションについては、「[COPY: 任意指定のパラメータ](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#r_COPY-syntax-overview-optional-parameters)」を参照してください)。 これらのオプションは`COPY`コマンドの最後に付加されるため、使用できるのはコマンドの最後で意味のあるオプションのみであることに注意してください。これで、考えられるほとんどのユースケースがカバーされるはずです。  | 
|  csvnullstring (実験的)  | いいえ | NULL |  CSV `tempformat` を使用するときに NULL として書き込む文字列値。これは実際のデータには出現しない値でなければなりません。  | 

これらの新しいパラメータは、次の方法で使用できます。

**パフォーマンス向上のための新しいオプション**  
新しいコネクタには、パフォーマンス向上のための新しいオプションがいくつか導入されています。
+ `autopushdown`: デフォルトでは有効になっています。
+ `autopushdown.s3_result_cache`: デフォルトでは無効になっています。
+ `unload_s3_format`: デフォルトでは `PARQUET` になっています。

これらのオプションの使用方法については、[Apache Spark 用の Amazon Redshift の統合](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) を参照してください。キャッシュされた結果には古い情報が含まれている可能性があるため、読み取りと書き込みのオペレーションが混在している場合は ` autopushdown.s3_result_cache` をオンにしないことをお勧めします。パフォーマンスを向上させ、ストレージコストを削減するために、`UNLOAD` コマンドの `unload_s3_format` オプションはデフォルトで `PARQUET` に設定されています。`UNLOAD` コマンドのデフォルト動作を使用するには、オプションを `TEXT` にリセットします。

**読み取り用の新しい暗号化オプション**  
デフォルトでは、Amazon Redshift テーブルからデータを読み取る際に AWS Glue が使用する一時フォルダ内のデータは、`SSE-S3` 暗号化を使用して暗号化されます。AWS Key Management Service (AWS KMS) のカスタマーマネージドキーを使用してデータを暗号化するには、AWS Glue バージョン 3.0 の従来の設定オプション `("extraunloadoptions" → s"ENCRYPTED KMS_KEY_ID '$kmsKey'")` ではなく、ksmKey が [AWS KMS からのキー ID](https://docs.aws.amazon.com/kms/latest/developerguide/find-cmk-id-arn.html) になるように `("sse_kms_key" → kmsKey)` を設定します。

```
datasource0 = glueContext.create_dynamic_frame.from_catalog(
  database = "database-name", 
  table_name = "table-name", 
  redshift_tmp_dir = args["TempDir"],
  additional_options = {"sse_kms_key":"<KMS_KEY_ID>"}, 
  transformation_ctx = "datasource0"
)
```

**IAM ベースの JDBC URL をサポート**  
新しいコネクタは IAM ベースの JDBC URL をサポートしているため、ユーザーやパスワード、またはシークレットを渡す必要はありません。IAM ベースの JDBC URL では、コネクタはジョブのランタイムロールを使用して Amazon Redshift データソースにアクセスします。

ステップ 1: 次の最低限必要なポリシーを AWS Glue ジョブランタイムロールにアタッチします。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentials",
            "Resource": [
                "arn:aws:redshift:us-east-1:111122223333:dbgroup:<cluster name>/*",
                "arn:aws:redshift:*:111122223333:dbuser:*/*",
                "arn:aws:redshift:us-east-1:111122223333:dbname:<cluster name>/<database name>"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "redshift:DescribeClusters",
            "Resource": "*"
        }
    ]
}
```

------

ステップ 2: IAM ベースの JDBC URL を次のように使用します。接続している Amazon Redshift ユーザー名で新しいオプション `DbUser` を指定します。

```
conn_options = {
     // IAM-based JDBC URL
    "url": "jdbc:redshift:iam://<cluster name>:<region>/<database name>",
    "dbtable": dbtable,
    "redshiftTmpDir": redshiftTmpDir,
    "aws_iam_role": aws_iam_role,
    "DbUser": "<Redshift User name>" // required for IAM-based JDBC URL
    }

redshift_write = glueContext.write_dynamic_frame.from_options(
    frame=dyf,
    connection_type="redshift",
    connection_options=conn_options
)

redshift_read = glueContext.create_dynamic_frame.from_options(
    connection_type="redshift",
    connection_options=conn_options
)
```

**注記**  
`DynamicFrame` は現在、`GlueContext.create_dynamic_frame.from_options` ワークフローに ` DbUser` が含まれている IAM ベースの JDBC URL のみをサポートしています。

## AWS Glue バージョン 3.0 からバージョン 4.0 への移行
<a name="aws-glue-programming-etl-redshift-migrating"></a>

AWS Glue 4.0 では、さまざまなオプションと設定を搭載した新しい JDBC ドライバーや Amazon Redshift Spark コネクタに ETL ジョブでアクセスできます。新しい Amazon Redshift コネクタとドライバーはパフォーマンスを念頭に置いて作成されており、データのトランザクションの一貫性が保たれます。これらの製品については、Amazon Redshift のドキュメントに記載されています。詳細については、以下を参照してください。
+ [Apache Spark 用の Amazon Redshift インテグレーション](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html)
+ [Amazon Redshift JDBC ドライバー、バージョン 2.1](https://docs.aws.amazon.com/redshift/latest/mgmt/jdbc20-download-driver.html)

**テーブル/列名と識別子の制限**  
新しい Amazon Redshift Spark コネクタとドライバーで、Redshift テーブル名の要件が厳しくなっています。Amazon Redshift のテーブル名定義の詳細については、[名前と識別子](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html) を参照してください。ジョブブックマークのワークフローは、ルールに一致しないテーブル名やスペースなどの特定の文字があると機能しない場合があります。

[名前と識別子](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html) のルールに適合しない名前のレガシーテーブルがあり、ブックマーク (古い Amazon Redshift テーブルデータを再処理するジョブ) に問題がある場合は、テーブル名を変更することをお勧めします。詳細については、[ALTER TABLE の例](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE_examples_basic.html) を参照してください。

**データフレームのデフォルトの一時形式の変更**  
AWS Glue バージョン 3.0 の Spark コネクタでは、Amazon Redshift への書き込み時にデフォルトで `tempformat` が CSV に設定されます。一貫性を保つために、AWS Glue バージョン 3.0 でも、` DynamicFrame` ではデフォルトで `tempformat` に `CSV` を使用するようになっています。以前に Amazon Redshift Spark コネクタで Spark データフレーム API を直接使用していた場合は、`DataframeReader`/`Writer` オプションで `tempformat` を CSV に明示的に設定できます。それ以外の場合は、新しい Spark コネクタで `tempformat` はデフォルトで `AVRO` になります。

**動作の変更: Amazon Redshift データ型 REAL を Spark データ型 DOUBLE ではなく FLOAT にマッピングする**  
AWS Glue バージョン 3.0 では、Amazon Redshift の `REAL` は Spark の ` DOUBLE` 型に変換されます。新しい Amazon Redshift Spark コネクタでは、動作が更新され、Amazon Redshift の ` REAL` 型が Spark の `FLOAT` 型に変換されたり、その逆の変換が行われたりするようになりました。従来のユースケースで引き続き Amazon Redshift の `REAL` 型を Spark の `DOUBLE` 型にマッピングする場合は、次の回避策を使用できます。
+ `DynamicFrame` の場合、`DynamicFrame.ApplyMapping` で `Float` 型を `Double` 型にマッピングします。`Dataframe` の場合、`cast` を使用する必要があります。

コードサンプル:

```
dyf_cast = dyf.apply_mapping([('a', 'long', 'a', 'long'), ('b', 'float', 'b', 'double')])
```

**VARBYTE データ型の処理**  
AWS Glue 3.0 および Amazon Redshift データ型を使用する場合、AWS Glue 3.0 は Amazon Redshift `VARBYTE` を Spark `STRING` 型に変換します。ただし、最新の Amazon Redshift Spark コネクタは `VARBYTE` データ型をサポートしていません。この制限を回避するには、`VARBYTE` 列をサポートされているデータ型に変換する [Redshift ビューを作成](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_VIEW.html) できます。次に、新しいコネクタを使用して、元のテーブルではなくこのビューからデータをロードします。これにより、`VARBYTE` データへのアクセスを維持しながら互換性が確保されます。

Redshift クエリの例:

```
CREATE VIEW view_name AS SELECT FROM_VARBYTE(varbyte_column, 'hex') FROM table_name
```