

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

您可以使用 AWS Glue for Spark 读取和写入 Amazon Redshift 数据库中的表。连接到 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 用户比以往任何时候都更轻松地迁移到 AWS Glue 进行无服务器数据集成和 ETL。

[![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 VPC，允许在 Amazon Redshift 集群、AWS Glue 作业和 Amazon S3 目录之间进行通信。
+ 对 AWS Glue 作业和 Amazon Redshift 集群具有相应的 IAM 权限。

### 配置 IAM 角色
<a name="aws-glue-programming-etl-redshift-config-iam"></a>

**为 Amazon Redshift 集群设置角色**  
您的 Amazon Redshift 集群需要能够读取和写入 Amazon S3，才能与 AWS Glue 作业集成。为此，您可以将 IAM 角色与要连接的新 Amazon Redshift 集群关联。您的角色应具有允许读取和写入 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: Permissions to access other AWS Resources](https://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-access-permissions.html)。

1. 在 IAM 控制台中，创建具有必要权限的 IAM policy。有关创建策略的更多信息，请参阅 [Creating IAM policies](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 文档中的 [Authorizing Amazon Redshift to access other AWS services on your behalf](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/zh_cn/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 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在左侧导航窗格中，选择**集群**。

1. 选择要从 AWS Glue 访问的集群名称。

1. 在 **Cluster Properties (集群属性)** 部分，从 **VPC security groups (VPC 安全组)** 中选择一个安全组以允许 AWS Glue 使用。记录下所选的安全组名称以供将来参考。选择安全组将打开 Amazon EC2 控制台 **Security Groups (安全组)** 列表。

1. 选择要修改的安全组并导航到**入站**选项卡。

1. 添加一个自引用规则，以允许 AWS Glue 组件进行通信。具体来讲，添加或确认有一条**类型**为 `All TCP` 的规则，**协议**为 `TCP`，**端口范围**包括所有端口，其**源**具有与**组 ID**相同的安全组名。

   入站规则类似如下：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/aws-glue-programming-etl-connect-redshift-home.html)

   例如：  
![\[自引用入站规则的示例。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/SetupSecurityGroup-Start.png)

1. 同时也为出站流量添加一条规则。打开到所有端口的出站流量，例如：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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 终端节点，还可以添加 HTTPS 规则以访问 Amazon S3。安全组规则中必须提供 *s3-prefix-list-id* 以允许从该 VPC 到 Amazon S3 VPC 终端节点的流量。

   例如：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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 Data Catalog 连接。

**在控制台中配置 Amazon Redshift Amazon VPC 与 AWS Glue 的连接**

1. 按照步骤创建 Data Catalog 连接：[添加 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 表的 Data Catalog 数据库和表。有关 Data Catalog 的更多信息，请参阅 [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 连接信息。**您将提供连接信息，包括*主机*、*端口*、*redshift-database-name*、用户名*和密码*。

使用 Amazon Redshift 集群时，您可以从 Amazon Redshift 控制台检索连接信息。使用 Amazon Redshift Serverless 时，请参阅 Amazon Redshift 文档中的 [Connecting to Amazon Redshift Serverless](https://docs.aws.amazon.com//redshift/latest/mgmt/serverless-connecting.html)。

**配置：**在函数选项中，您将使用 `url`、`dbtable`、`user` 和 `password` 参数标识连接参数。您将使用 `redshift_tmp_dir` 标识 Amazon S3 临时目录。您可以在使用 `aws_iam_role` 时使用 `from_options` 来指定 IAM 角色。语法类似于通过 Data Catalog 进行连接，但您可以将参数放在 `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 集群和表的 Data Catalog 数据库。有关 Data Catalog 的更多信息，请参阅 [AWS Glue 中的数据发现和编目](catalog-and-crawler.md)。您将使用 *redshift-dc-database-name* 标识连接，使用 *redshift-table-name* 标识目标表。

**配置：**在函数选项中，您将使用 `database` 参数标识 Data Catalog 数据库，并为表提供 `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` 方法引用存储在 Data Catalog 连接中的连接详细信息。无需为数据库爬取或创建 Data Catalog 表，即可执行此操作。有关 Data Catalog 连接的更多信息，请参阅 [连接到数据](glue-connections.md)。

**其他先决条件：**您要从中读取 Amazon Redshift 表的数据库的 Data Catalog 连接。

**配置：**您将使用 *dc-connection-name* 标识 Data Catalog 连接。*您将使用 *redshift-table-name* 和 redshift-database-name* 标识 Amazon Redshift 数据库和表。您将使用 `catalog_connection` 提供 Data Catalog 连接信息，使用 `dbtable` 和 `database` 提供 Amazon Redshift 信息。语法类似于通过 Data Catalog 进行连接，但您可以将参数放在 `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>

用于所有 AWS Glue JDBC 连接的基本连接选项在所有 JDBC 类型中都是一致的，用于设置 `url`、`user` 和 `password` 之类的信息。有关标准 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\$1 版本中提供了其他连接选项
<a name="aws-glue-programming-etl-redshift-enhancements"></a>

您也可以通过 AWS Glue 连接选项传递新的 Amazon Redshift 连接器的选项。有关支持的连接器选项的完整列表，请参阅[适用于 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 — 以 Parquet 格式卸载查询结果。 TEXT — 以竖线分隔的文本格式卸载查询结果。  | 
|  sse\$1kms\$1key  | 否 | 不适用 |  在 `UNLOAD` 操作期间用于加密的 AWS SSE-KMS 密钥，而不是 AWS 的默认加密。  | 
|  extracopyoptions  | 否 | 不适用 |  加载数据时附加到 Amazon Redshift `COPY`命令的额外选项列表，例如 `TRUNCATECOLUMNS` 或 `MAXERROR n`（有关其他选项，请参阅 [COPY: Optional 参数](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#r_COPY-syntax-overview-optional-parameters)）。 请注意，由于这些选项附加到 `COPY` 命令的末尾，因此只能使用在命令末尾有意义的选项。这应该涵盖最有可能的使用案例。  | 
|  cvsnullstring（实验）  | 否 | NULL |  使用 CSV `tempformat` 时要为空值写入的字符串值。这应该是一个不会出现在实际数据中的值。  | 

这些新参数可以通过以下方式使用。

**提高性能的新选项**  
新的连接器推出了一些新的性能改进选项：
+ `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）的客户自主管理型密钥来加密您的数据，您可以设置 `("sse_kms_key" → kmsKey)`，其中 ksmKey 是[来自 AWS KMS 的密钥 ID](https://docs.aws.amazon.com/kms/latest/developerguide/find-cmk-id-arn.html)，而不是 AWS Glue 版本 3.0 中的传统设置选项 `("extraunloadoptions" → s"ENCRYPTED KMS_KEY_ID '$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 中，ETL 作业可以访问新 Amazon Redshift Spark 连接器和新 JDBC 驱动程序，但选项和配置不同。全新 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 表名称的要求更为严格。有关更多信息，请参阅[名称和标识符](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html)以定义您的 Amazon Redshift 表名称。作业书签工作流程可能不适用于不符合规则的表名和某些字符（例如空格）。

如果您的旧表的名称不符合[名称和标识符](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html)规则，并且发现书签存在问题（作业正在重新处理旧的 Amazon Redshift 表数据），我们建议您重命名表名。有关更多信息，请参阅[修改表示例](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE_examples_basic.html)。

**数据帧中的默认临时格式更改**  
在写入到 Amazon Redshift 时，AWS Glue 版本 3.0 Spark 连接器会将 `tempformat` 的默认值设置为 CSV。为了保持一致，在 AWS Glue 3.0 版中，` DynamicFrame` 仍会将 `tempformat` 的默认值设置为使用 `CSV`。如果您之前曾在 Amazon Redshift Spark 连接器上直接使用过 Spark Dataframe API，则可以在 `DataframeReader`/`Writer` 选项中将 `tempformat` 明确设置为 CSV。否则，`tempformat` 在新 Spark 连接器中默认为 `AVRO`。

**行为更改：将 Amazon Redshift 数据类型 REAL 映射到 Spark 数据类型 FLOAT，而不是 DOUBLE**  
在 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` 数据类型。要解决此限制，您可以[创建一个 Redshift 视图](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_VIEW.html)，将 `VARBYTE` 列转换为支持的数据类型。然后，使用新的连接器从此视图（而不是原始表）加载数据，这样既能确保兼容性，又能保持对 `VARBYTE` 数据的访问。

Redshift 查询示例：

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