将数据写入 Azure 数据块中的 Delta Lake 时出现问题(检测到不兼容的格式)

Posted

技术标签:

【中文标题】将数据写入 Azure 数据块中的 Delta Lake 时出现问题(检测到不兼容的格式)【英文标题】:Trouble when writing the data to Delta Lake in Azure databricks (Incompatible format detected) 【发布时间】:2019-11-24 22:29:45 【问题描述】:

我需要将数据集读入 DataFrame,然后将数据写入 Delta Lake。但我有以下例外:

AnalysisException: 'Incompatible format detected.\n\nYou are trying to write to `dbfs:/user/class@azuredatabrickstraining.onmicrosoft.com/delta/customer-data/` using Databricks Delta, but there is no\ntransaction log present. Check the upstream job to make sure that it is writing\nusing format("delta") and that you are trying to write to the table base path.\n\nTo disable this check, SET spark.databricks.delta.formatCheck.enabled=false\nTo learn more about Delta, see https://docs.azuredatabricks.net/delta/index.html\n;

这是异常之前的代码:

from pyspark.sql.types import StructType, StructField, DoubleType, IntegerType, StringType

inputSchema = StructType([
  StructField("InvoiceNo", IntegerType(), True),
  StructField("StockCode", StringType(), True),
  StructField("Description", StringType(), True),
  StructField("Quantity", IntegerType(), True),
  StructField("InvoiceDate", StringType(), True),
  StructField("UnitPrice", DoubleType(), True),
  StructField("CustomerID", IntegerType(), True),
  StructField("Country", StringType(), True)
])

rawDataDF = (spark.read
  .option("header", "true")
  .schema(inputSchema)
  .csv(inputPath)
)

# write to Delta Lake
rawDataDF.write.mode("overwrite").format("delta").partitionBy("Country").save(DataPath) 

【问题讨论】:

DataPath 的值是多少?查看错误消息中的路径,它看起来是错误的。您是否尝试过诸如“/test/deltalaketest”之类的 dbfs 位置。 【参考方案1】:

此错误消息告诉您目标路径中已有数据(在本例中为 dbfs:/user/class@azuredatabrickstraining.onmicrosoft.com/delta/customer-data/),并且该数据不是 Delta 格式(即没有事务日志)。您可以选择一个新路径(基于上面的 cmets,看起来就像您所做的那样)或删除该目录并重试。

【讨论】:

感谢这些精确的@Michael :)【参考方案2】:

我通过此搜索找到了这个问题:“您正在尝试使用 Databricks Delta 写入 ***,但不存在事务日志。”

如果有人搜索相同的内容: 对我来说,解决方案是明确编码

.write.format("parquet")

因为

.format("delta")

是自 Databricks Runtime 8.0 及更高版本以来的默认设置,出于遗留原因,我需要“镶木地板”。

【讨论】:

以上是关于将数据写入 Azure 数据块中的 Delta Lake 时出现问题(检测到不兼容的格式)的主要内容,如果未能解决你的问题,请参考以下文章

Spark Job 卡住了将数据帧写入分区 Delta 表

Azure 数据块中的 Spring 版本

将数据写入 Azure 专用 SQL 池中的特定分区

从 Azure Synapse 中的 Apache Spark 将数据写入 SQL DW

将csv数据直接写入节点js中的azure blob

Azure 数据工厂问题将数据从本地 sql Server 写入 Azure SQL 数据库