通过 DBIO 向云存储进行事务性写入

Databricks DBIO 包为 Apache Spark 作业提供了对云存储的事务性写入。 这解决了在云原生设置中使用 Spark(例如,直接写入存储服务)时发生的许多性能和正确性问题。

重要

使用以 * 结尾的路径访问数据时,将不遵循提交协议。 例如,读取 dbfs://my/path 将只返回已提交的更改,而读取 dbfs://my/path/* 将返回目录中所有数据文件的内容,不管这些文件的内容是否已提交。 这是预期的行为。

使用 DBIO 事务提交,以 _started_<id>_committed_<id> 开头的元数据文件将伴随着 Spark 作业创建的数据文件。 通常不应直接更改这些文件, 而应使用 VACUUM 命令将其清除。

清除未提交的文件

若要清除 Spark 作业遗留的未提交文件,请使用 VACUUM 命令将其删除。 通常,VACUUM 在 Spark 作业完成后自动执行,但如果作业中止,你也可以手动运行该命令。

例如,VACUUM ... RETAIN 1 HOUR 会删除一小时前的未提交文件。

重要

  • 请避免在不到一小时的时间内执行 vacuum 命令。 这可能会导致数据不一致。

另请参阅 Vacuum

SQL

-- recursively vacuum an output path
VACUUM '/path/to/output/directory' [RETAIN <N> HOURS]

-- vacuum all partitions of a catalog table
VACUUM tableName [RETAIN <N> HOURS]

Scala

// recursively vacuum an output path
spark.sql("VACUUM '/path/to/output/directory' [RETAIN <N> HOURS]")

// vacuum all partitions of a catalog table
spark.sql("VACUUM tableName [RETAIN <N> HOURS]")