从云存储导入 Apache Parquet 文件到 TiDB Cloud 专属集群
本文档介绍如何将 Apache Parquet 文件从 Amazon Simple Storage Service(Amazon S3)、Google Cloud Storage(GCS)或 Azure Blob Storage 导入到 TiDB Cloud 专属集群。你可以导入未压缩的 Parquet 文件或使用 Google Snappy 压缩的 Parquet 文件。不支持其他 Parquet 压缩编解码器。
限制
为确保数据一致性,TiDB Cloud 仅允许将 Parquet 文件导入到空表中。若需将数据导入到已存在数据的表中,你可以按照本文档的步骤,先将数据导入到一个临时空表中,然后使用
INSERT SELECT
语句将数据复制到目标表。如果 TiDB Cloud 专属集群已开启 changefeed 或 时间点恢复,则无法向该集群导入数据(Import Data 按钮会被禁用),因为当前数据导入功能使用的是 物理导入模式。在该模式下,导入的数据不会生成变更日志,因此 changefeed 和时间点恢复无法检测到导入的数据。
第 1 步:准备 Parquet 文件
如果单个 Parquet 文件大于 256 MB,建议将其拆分为多个小文件,每个文件大小约为 256 MB。
TiDB Cloud 支持导入非常大的 Parquet 文件,但在多个约 256 MB 的输入文件时性能最佳。这是因为 TiDB Cloud 可以并行处理多个文件,从而大幅提升导入速度。
按如下方式命名 Parquet 文件:
- 如果一个 Parquet 文件包含整个表的所有数据,文件名应采用
${db_name}.${table_name}.parquet
格式,导入时会映射到${db_name}.${table_name}
表。 - 如果一个表的数据被拆分为多个 Parquet 文件,应为这些文件添加数字后缀。例如,
${db_name}.${table_name}.000001.parquet
和${db_name}.${table_name}.000002.parquet
。数字后缀可以不连续,但必须递增,并且需要在数字前补零以保证所有后缀长度一致。
- 如果一个 Parquet 文件包含整个表的所有数据,文件名应采用
第 2 步:创建目标表结构
由于 Parquet 文件不包含表结构信息,在将 Parquet 文件中的数据导入 TiDB Cloud 之前,你需要通过以下任一方式创建表结构:
方法一:在 TiDB Cloud 中为源数据创建目标数据库和数据表。
方法二:在存放 Parquet 文件的 Amazon S3、GCS 或 Azure Blob Storage 目录下,为源数据创建目标表结构文件,具体如下:
为源数据创建数据库结构文件。
如果你的 Parquet 文件遵循 第 1 步 的命名规则,则数据库结构文件为可选项,否则为必需项。
每个数据库结构文件必须采用
${db_name}-schema-create.sql
格式,并包含一个CREATE DATABASE
DDL 语句。通过该文件,TiDB Cloud 会在导入数据时创建${db_name}
数据库以存储你的数据。例如,如果你创建了一个包含如下语句的
mydb-scehma-create.sql
文件,TiDB Cloud 会在导入数据时创建mydb
数据库。CREATE DATABASE mydb;为源数据创建表结构文件。
如果你未在 Parquet 文件所在的 Amazon S3、GCS 或 Azure Blob Storage 目录下包含表结构文件,TiDB Cloud 在导入数据时不会为你创建相应的数据表。
每个表结构文件必须采用
${db_name}.${table_name}-schema.sql
格式,并包含一个CREATE TABLE
DDL 语句。通过该文件,TiDB Cloud 会在导入数据时于${db_name}
数据库中创建${db_table}
表。例如,如果你创建了一个包含如下语句的
mydb.mytable-schema.sql
文件,TiDB Cloud 会在mydb
数据库中创建mytable
表。CREATE TABLE mytable ( ID INT, REGION VARCHAR(20), COUNT INT );
第 3 步:配置跨账号访问
为了让 TiDB Cloud 能够访问 Amazon S3、GCS 或 Azure Blob Storage 中的 Parquet 文件,请按以下方式操作:
如果 Parquet 文件位于 Amazon S3,配置 Amazon S3 访问权限。
你可以使用 AWS 访问密钥或 Role ARN 访问你的存储桶。完成后,请记录访问密钥(包括访问密钥 ID 和密钥)或 Role ARN 值,后续在 第 4 步 中会用到。
如果 Parquet 文件位于 GCS,配置 GCS 访问权限。
如果 Parquet 文件位于 Azure Blob Storage,配置 Azure Blob Storage 访问权限。
第 4 步:将 Parquet 文件导入 TiDB Cloud
要将 Parquet 文件导入 TiDB Cloud,请按以下步骤操作:
打开目标集群的 Import 页面。
登录 TiDB Cloud 控制台,进入项目的 Clusters 页面。
提示:
你可以使用左上角的下拉框切换组织、项目和集群。
点击目标集群名称进入概览页面,然后在左侧导航栏点击 Data > Import。
选择 Import data from Cloud Storage。
在 Import Data from Amazon S3 页面,填写以下信息:
- Included Schema Files:如果源文件夹包含目标表结构文件(如
${db_name}-schema-create.sql
),请选择 Yes,否则选择 No。 - Data Format:选择 Parquet。
- Folder URI:输入源文件夹的 URI,格式为
s3://[bucket_name]/[data_source_folder]/
,路径必须以/
结尾。例如,s3://sampledata/ingest/
。 - Bucket Access:你可以使用 AWS IAM Role ARN 或 AWS 访问密钥访问存储桶。
- AWS Role ARN(推荐):输入 AWS IAM Role ARN。如果还没有为存储桶创建 IAM 角色,可以点击 Click here to create new one with AWS CloudFormation,按照屏幕提示使用提供的 AWS CloudFormation 模板创建。也可以手动为存储桶创建 IAM Role ARN。
- AWS Access Key:输入 AWS 访问密钥 ID 和 AWS 密钥。
- 两种方式的详细说明见 配置 Amazon S3 访问权限。
- Included Schema Files:如果源文件夹包含目标表结构文件(如
点击 Connect。
在 Destination 部分,选择目标数据库和数据表。
当导入多个文件时,可以通过 Advanced Settings > Mapping Settings 自定义每个目标表与其对应 Parquet 文件的映射。对于每个目标数据库和表:
- Target Database:从列表中选择对应的数据库名。
- Target Table:从列表中选择对应的表名。
- Source File URIs and Names:输入源文件的完整 URI,包括文件夹和文件名,格式为
s3://[bucket_name]/[data_source_folder]/[file_name].parquet
。例如,s3://sampledata/ingest/TableName.01.parquet
。你也可以使用通配符(?
和*
)匹配多个文件。例如:s3://[bucket_name]/[data_source_folder]/my-data1.parquet
:将[data_source_folder]
下名为my-data1.parquet
的单个 Parquet 文件导入目标表。s3://[bucket_name]/[data_source_folder]/my-data?.parquet
:将[data_source_folder]
下所有以my-data
开头、后跟一个字符(如my-data1.parquet
和my-data2.parquet
)的 Parquet 文件导入同一目标表。s3://[bucket_name]/[data_source_folder]/my-data*.parquet
:将[data_source_folder]
下所有以my-data
开头(如my-data10.parquet
和my-data100.parquet
)的 Parquet 文件导入同一目标表。
点击 Start Import。
当导入进度显示 Completed 时,检查已导入的数据表。
打开目标集群的 Import 页面。
登录 TiDB Cloud 控制台,进入项目的 Clusters 页面。
提示:
你可以使用左上角的下拉框切换组织、项目和集群。
点击目标集群名称进入概览页面,然后在左侧导航栏点击 Data > Import。
选择 Import data from Cloud Storage。
在 Import Data from Cloud Storage 页面,为源 Parquet 文件填写以下信息:
- Included Schema Files:如果源文件夹包含目标表结构文件(如
${db_name}-schema-create.sql
),请选择 Yes,否则选择 No。 - Data Format:选择 Parquet。
- Folder URI:输入源文件夹的 URI,格式为
gs://[bucket_name]/[data_source_folder]/
,路径必须以/
结尾。例如,gs://sampledata/ingest/
。 - Google Cloud Service Account ID:TiDB Cloud 会在此页面提供一个唯一的 Service Account ID(如
example-service-account@your-project.iam.gserviceaccount.com
)。你必须在 Google Cloud 项目中为该 Service Account ID 授予所需的 IAM 权限(如 “Storage Object Viewer”)以访问你的 GCS 存储桶。更多信息见 配置 GCS 访问权限。
- Included Schema Files:如果源文件夹包含目标表结构文件(如
点击 Connect。
在 Destination 部分,选择目标数据库和数据表。
当导入多个文件时,可以通过 Advanced Settings > Mapping Settings 自定义每个目标表与其对应 Parquet 文件的映射。对于每个目标数据库和表:
- Target Database:从列表中选择对应的数据库名。
- Target Table:从列表中选择对应的表名。
- Source File URIs and Names:输入源文件的完整 URI,包括文件夹和文件名,格式为
gs://[bucket_name]/[data_source_folder]/[file_name].parquet
。例如,gs://sampledata/ingest/TableName.01.parquet
。你也可以使用通配符(?
和*
)匹配多个文件。例如:gs://[bucket_name]/[data_source_folder]/my-data1.parquet
:将[data_source_folder]
下名为my-data1.parquet
的单个 Parquet 文件导入目标表。gs://[bucket_name]/[data_source_folder]/my-data?.parquet
:将[data_source_folder]
下所有以my-data
开头、后跟一个字符(如my-data1.parquet
和my-data2.parquet
)的 Parquet 文件导入同一目标表。gs://[bucket_name]/[data_source_folder]/my-data*.parquet
:将[data_source_folder]
下所有以my-data
开头(如my-data10.parquet
和my-data100.parquet
)的 Parquet 文件导入同一目标表。
点击 Start Import。
当导入进度显示 Completed 时,检查已导入的数据表。
打开目标集群的 Import 页面。
登录 TiDB Cloud 控制台,进入项目的 Clusters 页面。
提示:
你可以使用左上角的下拉框切换组织、项目和集群。
点击目标集群名称进入概览页面,然后在左侧导航栏点击 Data > Import。
选择 Import data from Cloud Storage。
在 Import Data from Azure Blob Storage 页面,填写以下信息:
- Included Schema Files:如果源文件夹包含目标表结构文件(如
${db_name}-schema-create.sql
),请选择 Yes,否则选择 No。 - Data Format:选择 Parquet。
- Folder URI:输入源文件所在的 Azure Blob Storage URI,格式为
https://[account_name].blob.core.windows.net/[container_name]/[data_source_folder]/
,路径必须以/
结尾。例如,https://myaccount.blob.core.windows.net/mycontainer/data-ingestion/
。 - SAS Token:输入账户 SAS token,以允许 TiDB Cloud 访问 Azure Blob Storage 容器中的源文件。如果还没有 SAS token,可以点击 Click here to create a new one with Azure ARM template,按照屏幕提示使用提供的 Azure ARM 模板创建。也可以手动创建账户 SAS token。更多信息见 配置 Azure Blob Storage 访问权限。
- Included Schema Files:如果源文件夹包含目标表结构文件(如
点击 Connect。
在 Destination 部分,选择目标数据库和数据表。
当导入多个文件时,可以通过 Advanced Settings > Mapping Settings 自定义每个目标表与其对应 Parquet 文件的映射。对于每个目标数据库和表:
- Target Database:从列表中选择对应的数据库名。
- Target Table:从列表中选择对应的表名。
- Source File URIs and Names:输入源文件的完整 URI,包括文件夹和文件名,格式为
https://[account_name].blob.core.windows.net/[container_name]/[data_source_folder]/[file_name].parquet
。例如,https://myaccount.blob.core.windows.net/mycontainer/data-ingestion/TableName.01.parquet
。你也可以使用通配符(?
和*
)匹配多个文件。例如:https://[account_name].blob.core.windows.net/[container_name]/[data_source_folder]/my-data1.parquet
:将[data_source_folder]
下名为my-data1.parquet
的单个 Parquet 文件导入目标表。https://[account_name].blob.core.windows.net/[container_name]/[data_source_folder]/my-data?.parquet
:将[data_source_folder]
下所有以my-data
开头、后跟一个字符(如my-data1.parquet
和my-data2.parquet
)的 Parquet 文件导入同一目标表。https://[account_name].blob.core.windows.net/[container_name]/[data_source_folder]/my-data*.parquet
:将[data_source_folder]
下所有以my-data
开头(如my-data10.parquet
和my-data100.parquet
)的 Parquet 文件导入同一目标表。
点击 Start Import。
当导入进度显示 Completed 时,检查已导入的数据表。
当你运行导入任务时,如果检测到任何不支持或无效的类型转换,TiDB Cloud 会自动终止导入任务并报告导入错误。你可以在 Status 字段查看详细信息。
如果遇到导入错误,请按以下步骤操作:
删除部分导入的表。
检查表结构文件,如有错误请修正。
检查 Parquet 文件中的数据类型。
如果 Parquet 文件包含任何不支持的数据类型(如
NEST STRUCT
、ARRAY
或MAP
),你需要使用 支持的数据类型(如STRING
)重新生成 Parquet 文件。重新尝试导入任务。
支持的数据类型
下表列出了可导入到 TiDB Cloud 的 Parquet 支持数据类型。
Parquet Primitive Type | Parquet Logical Type | Types in TiDB or MySQL |
---|---|---|
DOUBLE | DOUBLE | DOUBLE FLOAT |
FIXED_LEN_BYTE_ARRAY(9) | DECIMAL(20,0) | BIGINT UNSIGNED |
FIXED_LEN_BYTE_ARRAY(N) | DECIMAL(p,s) | DECIMAL NUMERIC |
INT32 | DECIMAL(p,s) | DECIMAL NUMERIC |
INT32 | N/A | INT MEDIUMINT YEAR |
INT64 | DECIMAL(p,s) | DECIMAL NUMERIC |
INT64 | N/A | BIGINT INT UNSIGNED MEDIUMINT UNSIGNED |
INT64 | TIMESTAMP_MICROS | DATETIME TIMESTAMP |
BYTE_ARRAY | N/A | BINARY BIT BLOB CHAR LINESTRING LONGBLOB MEDIUMBLOB MULTILINESTRING TINYBLOB VARBINARY |
BYTE_ARRAY | STRING | ENUM DATE DECIMAL GEOMETRY GEOMETRYCOLLECTION JSON LONGTEXT MEDIUMTEXT MULTIPOINT MULTIPOLYGON NUMERIC POINT POLYGON SET TEXT TIME TINYTEXT VARCHAR |
SMALLINT | N/A | INT32 |
SMALLINT UNSIGNED | N/A | INT32 |
TINYINT | N/A | INT32 |
TINYINT UNSIGNED | N/A | INT32 |
故障排查
解决数据导入过程中的警告
点击 Start Import 后,如果看到类似 can't find the corresponding source files
的警告信息,可以通过提供正确的源文件、按照 数据导入命名规范重命名现有文件,或使用 Advanced Settings 进行调整来解决。
解决后需要重新导入数据。
导入表中数据行为零
导入进度显示 Completed 后,检查已导入的数据表。如果行数为零,说明没有数据文件匹配你输入的 Bucket URI。此时,可以通过提供正确的源文件、按照 数据导入命名规范重命名现有文件,或使用 Advanced Settings 进行调整来解决。之后请重新导入这些表。