我正在尝试使用深度克隆将数据从 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 元数据目录中创建并注册了表,我仍然遇到此错误。 任何人都可以深入了解可能导致此问题的原因吗?此外,是否可以使用深度克隆将数据从一个数据湖迁移到另一个数据湖?
引用同一个文档,提及如下:
在克隆并使用表名称来标识源表之前,您必须将带有分区的 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>;