【问题标题】:Databricks: Converting Parquet Table To Delta TableDatabricks:将 Parquet 表转换为 Delta 表
【发布时间】:2020-11-04 12:38:55
【问题描述】:

我试图将 Databricks(Azure 上的存储)中的现有表转换为 Delta。根据here 提供的信息,这很简单,我写了 2 个sql 声明如下:

convert to delta default.tableName

convert to delta parquet.`dbfs:/path/to/storage/`

语句根据输出消息运行OK。但是,当我尝试desc 表时,我发现Provider 仅是parquet。为了进行验证,我在表上运行了delete 操作以获取一些记录,这给了我错误:

A transaction log for Databricks Delta was found at `dbfs:/path/to/storage/default.db/tableName/_delta_log`,
but you are trying to read from `dbfs:/path/to/storage/default.db/tableName` using format("parquet"). You must use
'format("delta")' when reading and writing to a delta table.

不知道这里出了什么问题。有什么想法吗?

【问题讨论】:

  • 您使用了哪个语句?表名版本还是dbfs路径版本?

标签: apache-spark-sql databricks azure-databricks delta-lake


【解决方案1】:

如果您使用convert to delta 命令的路径版本,它不会更新 Hive Metastore。 Hive Metastore 和存储之间的不一致会导致这样的混乱错误。

如果使用convert to delta命令的表名版本,则需要Databricks Runtime 6.6

Hive 元存储中引用的 Parquet 表现在可以使用 CONVERT TO DELTA 通过其表标识符转换为 Delta Lake。有关详细信息,请参阅转换为 Delta(Databricks 上的 Delta Lake)。虽然此功能之前在 Databricks Runtime 6.1 中宣布,但完全支持已延迟到 Databricks Runtime 6.6。

【讨论】:

  • 首先我在表语句上尝试了Convert to delta,它没有给我适当的结果。然后我将路径转换用于镶木地板。我目前有运行时 7.0,所以它应该可以完成这项工作。我去过这个文档并遵循了那里的内容。这并不能解决问题。
  • 您能否重现该问题?你可能需要联系 Azure Databricks 来帮助解决这个问题。
  • 谢谢,为我工作:我的问题是我首先使用 DBR 6.4 运行 convert to delta...,但随后我使用 DBR 8.3 重新运行 - 问题消失了
【解决方案2】:

实现这一目标的另一种方法是:

df = spark.sql('select * from  normal_table') # Read the non delta parquet table

df.write.format("delta").mode('overwrite').save("ADLS PATH") #write with format as delta

spark.sql("CREATE TABLE IF NOT EXISTS delta.Table_Name USING DELTA LOCATION 'ADLS PATH-pointing to the above path'") #create a delta table pointing to the above delta path.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2022-11-05
    • 2021-10-29
    • 1970-01-01
    • 2019-06-06
    • 2019-05-14
    • 2022-10-16
    • 2018-12-15
    相关资源
    最近更新 更多