Databricks Runtime 8.0 迁移指南

未指定格式时,Delta 为默认格式

Databricks Runtime 8.0 会将默认格式更改为 delta,以更轻松地创建 Delta 表。 使用 SQL 命令或 {Dataset|DataFrame}.{read|readStream|write|writeTo|writeStream} API 创建表,且未指定格式时,默认格式为 delta。 此行为等同于在代码中将格式指定为 delta

通过 Delta Lake,可获得比 Parquet 更好的性能,并通过丰富的架构验证、质量约束和事务保证来实现更高的数据可靠性。 借助 Delta Lake,可以在单个数据源上进行统一的结构化流式处理和批处理,从而简化数据管道。

尽管 Databricks 建议使用 Delta Lake 来存储数据,但你可能具有需要迁移到 Delta Lake 的传统工作流。 若要保持以前的行为,有两个选项可供选择:

选项 1:设置配置

可在群集上将 spark.sql.sources.default 设置为 parquet,将 spark.sql.legacy.createHiveTableByDefault 设置为 true。 设置这两个配置后,应看到与 Databricks Runtime 7.x 及更低版本完全相同的行为。

选项 2:修改代码

如果不想在群集上设置额外的配置,可修改代码来保持以前的行为。 下面的示例演示如何显式指定用于覆盖默认值的格式。

不带 AS SELECT 子句的 CREATE TABLE

在 Databricks Runtime 7.x 及更低版本中,在未指定格式(如 CREATE TABLE student(id INT, name STRING, age INT))的情况下在 SQL 查询中创建不带 AS SELECT 子句的表时,会创建一个 Hive 表,这等同于你在查询中编写了 USING HIVE。 在 Databricks Runtime 8.x 中,它的行为等同于你编写了 USING DELTA。 如果要创建 Hive 表,则必须在 Databricks Runtime 8.0 中添加 USING HIVE

带有 AS SELECT 子句的 CREATE TABLE (CTAS)

在 Databricks Runtime 7.x 及更低版本中,在未指定格式(如 CREATE TABLE student AS SELECT 1 AS id, 'Andy' AS name, 20 AS age)的情况下在 SQL 查询中创建带有 AS SELECT 子句的表时,会创建一个 Parquet 表,这等同于你在查询中编写了 USING PARQUET。 在 Databricks Runtime 8.x 中,它的行为等同于你编写了 USING DELTA。 如果要创建 Parquet 表,则必须在 Databricks Runtime 8.0 中添加 USING PARQUET

{Dataset|DataFrame}.{read|readStream} API

在 Databricks Runtime 7.x 及更低版本中,当你使用 {Dataset|DataFrame}.{read|readStream} API 读取路径或表时,如果未指定格式并且基础文件格式不是 Delta,则它将使用 Parquet 格式读取路径或表,这等同于你编写了 format("parquet")。 在 Databricks Runtime 8.0 中,将默认格式更改为 delta 后, 它的行为等同于你编写了 format("delta"),这意味着,如果省略之前在 Databricks Runtime 7.x 中用于读取 Parquet 表的格式,则必须在 Databricks Runtime 8.0 中添加 format("parquet")。 在 Databricks Runtime 8.0 及更高版本中,可以读取和写入表,而无需提及任何格式,因为读取和写入 API 将默认使用 delta 格式。

{Dataset|DataFrame}.{write|writeTo|writeStream} API

在 Databricks Runtime 7.x 及更低版本中,使用 {Dataset|DataFrame}.{write|writeTo|writeStream} API 写入路径或表时,如果未指定格式,则当该路径或表不存在,或者要写入的表不是 Delta 表时,它会使用 Parquet 格式将数据写入该路径或表,这等同于你编写了 format("parquet")。 在 Databricks Runtime 8.0 中,它的行为等同于你编写了 format("delta"),这意味着,如果省略之前用于写入到 Parquet 表的格式,则必须在 Databricks Runtime 8.0 中添加 format("parquet")。 在 Databricks Runtime 8.0 及更高版本中,可以读取和写入表,而无需提及任何格式,因为读取和写入 API 将默认使用 delta 格式。

常见问题 (FAQ)

创建表后如何知道其格式?

可以使用 DESCRIBE DETAIL 来查看表格式。

如果在意外未指定格式的情况下创建了 Delta 表,是否可将其转换为 Parquet 表或 Hive 表?

最简单的方法是新建一个带有所需格式的表,然后将 Delta 表中的现有数据写入到新表中。

如果遇到意外问题,如何获取更多帮助?

请联系 Databricks 支持人员,他们可以查看你的案例并帮助制定迁移策略。

Apache Spark 3.1.1 迁移指南

请参阅 Apache Spark 3.1.1 迁移指南,了解 Databricks Runtime 8.0 继承自 Apache Spark 的更改。