如何使用databricks执行深度克隆以将数据从一个Datalake迁移到另一个Datalake?

问题描述 投票:0回答:1

我正在尝试使用深度克隆将数据从 Azure Data Lake 迁移到 S3。源Data Lake中的数据以Parquet格式存储并分区。我尝试遵循 Databricks 的documentation,这表明我需要在克隆之前在 Hive 元存储等目录中注册带有分区的 Parquet 表。但是,我在尝试执行克隆命令时遇到错误。

首先,我使用以下 SQL 语句在目标数据湖中创建了一个表:

CREATE TABLE IF NOT EXISTS customerOrderArchive (
column1 datatype,
column2 datatype,
...
)
PARTITIONED BY (batchid string)
LOCATION 'targetPath/temp';

该表已在目录中成功创建。

然后,我尝试执行克隆命令,如下所示:

CREATE OR REPLACE TABLE cdf.customerOrderArchive
CLONE parquet.`sourcePath/customerorder/`

但是,这导致了以下错误:

SparkException: Job aborted due to stage failure: Task 5 in stage 381.0 failed 4 times, most recent failure: Lost task 5.3 in stage 381.0 (TID 2488) (10.139.64.15 executor 0): com.databricks.sql.transaction.tahoe.DeltaAnalysisException: Expecting 0 partition column(s): [], but found 1 partition column(s): [`batchid`] from parsing the file name: abfs://pathToSource/batchid=20240123235612633/part-00000-tid-792802563625641899-725c22de-6f96-439a-927b-f4e70648de3a-42-1.c000.snappy.parquet

尽管在 Spark 元数据目录中创建并注册了表,我仍然遇到此错误。 任何人都可以深入了解可能导致此问题的原因吗?此外,是否可以使用深度克隆将数据从一个数据湖迁移到另一个数据湖?

apache-spark apache-spark-sql databricks
1个回答
0
投票

引用同一个文档,提及如下:

在克隆并使用表名称来标识源表之前,您必须将带有分区的 Parquet 表注册到 Hive 元存储等目录。 您不能对带有分区的 Parquet 表使用基于路径的克隆语法

这意味着如果您有一个已分区的源 Parquet 表,则无法使用以下语法来克隆在 Hive Metastore 中注册的分区 Parquet 表:

CREATE OR REPLACE TABLE <target-table-name> CLONE parquet.`/path/to/data`;

相反,建议的方法是:

CREATE OR REPLACE TABLE <target-table-name> CLONE <source-table-name>;

CREATE OR REPLACE TABLE cdf.customerOrderArchive CLONE <source-table-name>;
© www.soinside.com 2019 - 2024. All rights reserved.