【问题标题】:Databricks - failing to write from a DataFrame to a Delta locationDatabricks - 无法从 DataFrame 写入 Delta 位置
【发布时间】:2019-05-06 14:14:32
【问题描述】:

我想更改 Databricks Delta 表的列名。

所以我做了以下事情:

// Read old table data
val old_data_DF = spark.read.format("delta")
.load("dbfs:/mnt/main/sales")

// Created a new DF with a renamed column
val new_data_DF = old_data_DF
      .withColumnRenamed("column_a", "metric1")
      .select("*")

// Dropped and recereated the Delta files location
dbutils.fs.rm("dbfs:/mnt/main/sales", true)
dbutils.fs.mkdirs("dbfs:/mnt/main/sales")

// Trying to write the new DF to the location
new_data_DF.write
.format("delta")
.partitionBy("sale_date_partition")
.save("dbfs:/mnt/main/sales")

我在最后一步写信给 Delta 时遇到错误:

java.io.FileNotFoundException: dbfs:/mnt/main/sales/sale_date_partition=2019-04-29/part-00000-769.c000.snappy.parquet
A file referenced in the transaction log cannot be found. This occurs when data has been manually deleted from the file system rather than using the table `DELETE` statement

显然数据已被删除,很可能我错过了上述逻辑中的某些内容。现在唯一包含数据的地方是new_data_DF。 写入像dbfs:/mnt/main/sales_tmp 这样的位置也会失败

如何将数据从 new_data_DF 写入 Delta 位置?

【问题讨论】:

  • DataFrames 是引用,它们不包含任何数据。您应该尝试将数据写入其他位置,然后交换表。

标签: scala apache-spark databricks delta-lake


【解决方案1】:

一般来说,避免在 Delta 表上使用 rm 是个好主意。 Delta 的事务日志在大多数情况下可以防止最终的一致性问题,但是,当您在很短的时间内删除并重新创建表时,不同版本的事务日志可能会忽隐忽现。

相反,我建议使用 Delta 提供的事务原语。例如,overwrite the data in a table 您可以:

df.write.format("delta").mode("overwrite").save("/delta/events")

如果您的表已经损坏,您可以使用FSCK 修复它。

【讨论】:

【解决方案2】:

您可以通过以下方式做到这一点。

// Read old table data
val old_data_DF = spark.read.format("delta")
.load("dbfs:/mnt/main/sales")

// Created a new DF with a renamed column
val new_data_DF = old_data_DF
  .withColumnRenamed("column_a", "metric1")
  .select("*")

// Trying to write the new DF to the location
new_data_DF.write
.format("delta")
.mode("overwrite") // this would overwrite the whole data files
.option("overwriteSchema", "true")  //this is the key line.
.partitionBy("sale_date_partition")
.save("dbfs:/mnt/main/sales")

OverWriteSchema 选项将使用我们在转换期间更新的最新架构创建新的物理文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多