如何将 Parquet 文件转换为 Delta 文件

Posted

技术标签:

【中文标题】如何将 Parquet 文件转换为 Delta 文件【英文标题】:How to convert Parquet file to Delta file 【发布时间】:2022-01-17 12:49:25 【问题描述】:

我正在尝试将 parquet 文件转换为同一目录中的 delta 文件。

当我更改目录时,文件被创建,但是当我尝试在同一目录中创建增量文件时,它不起作用。

创建的日志仅包括提交。

"commitInfo":"timestamp":1639462569886,"userId":"1873721116118433","userName":"removed!!","operation":"WRITE","operationParameters":"mode": "Append","partitionBy":"["Buyer_Partner_Code"]","notebook":"notebookId":"3864076797603349","clusterId":"0713-055328-sonar10","re​​adVersion":0," isolationLevel":"SnapshotIsolation","isBlindAppend":true,"operationMetrics":"numFiles":"0","numOutputBytes":"0","numOutputRows":"0"

df1.write.format("delta").mode("append").save("/data/dbo/csm_currencyratetype/Buyer_Partner_Code=190935/")

【问题讨论】:

【参考方案1】:

Delta 使用您已经拥有的相同文件 .parquet,但首先您应该创建 delta 表以创建 delta 日志和元数据。创建后,您的目录将是一个增量表,您可以继续使用增量格式附加或更新数据。

import io.delta.tables._

// Convert unpartitioned Parquet table at path '<path-to-table>'
val deltaTable = DeltaTable.convertToDelta(spark, "parquet.`<path-to-table>`")

https://docs.delta.io/latest/delta-utility.html#convert-a-parquet-table-to-a-delta-table

【讨论】:

好的,我正在尝试这个。【参考方案2】:

我会将您的parquet注册为表格(您可以尝试直接将其保存为delta,如果您使用parquet则需要在第二步进行转换,请在此之前备份您的数据):

%sql
CREATE TABLE buyer USING [DELTA/PARQUET] OPTIONS (path
"/data/dbo/csm_currencyratetype/Buyer_Partner_Code=190935/");

比使用简单的sql转换:

%sql
CONVERT TO DELTA buyer;

Buyer_Partner_Code 看起来像分区号,所以我认为表的路径应该是“/data/dbo/csm_currencyratetype/”

【讨论】:

【参考方案3】:

要回答这个问题,我们可以先了解 Databricks 中的 delta 格式文件。这样我们就可以清楚地理解为什么会出现这个问题。

当用户创建 Delta Lake 表时,该表的事务日志会自动创建在 _delta_log 子目录中。当他或她对该表进行更改时,这些更改将作为有序的原子提交记录在事务日志中。每个提交都写成一个 JSON 文件,以 000000.json 开头。对表的其他更改会按数字升序生成后续 JSON 文件,以便下一次提交写为000001.json,以下为000002.json,依此类推。

在这种情况下,当您在同一目录中回写时,Parquet 和 delta 都会发生冲突。所以你可以把它写在另一个目录中,而不是在同一个目录中。

【讨论】:

以上是关于如何将 Parquet 文件转换为 Delta 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 txt 文件转换为 parquet 文件并将其加载到 hdfs table-pyspark

如何使用 AWS Glue 将许多 CSV 文件转换为 Parquet

如何从 parquet 文件中选择 13 位时间戳列,将其转换为日期并存储为数据框?

将 Parquet 转换为 CSV

映射数据流可以使用参数化 Parquet 数据集吗?

使用 Spark 将 csv.gz 文件转换为 Parquet