DataBricks Best Practice for Delta Lake

本文介绍了使用 Delta Lake 时的最佳做法。

Databricks 建议使用预测性优化。 请参阅 Delta Lake 的预测性优化。

删除并在同一位置重新创建表时,应始终使用 CREATE OR REPLACE TABLE 语句。 请参阅删除或替换 Delta 表。

移除旧版 Delta 配置

Databricks 建议在升级到新的 Databricks Runtime 版本时,从 Spark 配置和表属性中移除大多数显式旧版 Delta 配置。 旧版配置可以防止 Databricks 引入的新优化和默认值应用于已迁移的工作负荷。

使用 liquid 聚类分析优化数据跳过

Databricks 建议使用 liquid 聚类分析,而不是分区、Z 顺序或其他数据组织策略来优化数据跳过的数据布局。 请参阅对 Delta 表使用 liquid 聚类分析。

压缩文件

预测优化会在 Unity Catalog 托管表上自动运行 OPTIMIZE 和 VACUUM 命令。 请参阅 Delta Lake 的预测性优化。

Databricks 建议经常运行 OPTIMIZE 命令来压缩小文件。

 备注

此操作不会移除旧文件。 若要移除它们,请运行 VACUUM 命令。

替换表的内容或架构

有时候,你可能希望替换 Delta 表。 例如: 。

  • 你发现表中的数据不正确,需要对内容进行替换。
  • 你希望重写整个表,以执行不兼容架构更改(例如更改列类型)。

尽管可以删除 Delta 表的整个目录并在同一路径上创建新表,但不建议这样做,因为:

  • 删除目录效率不高。 删除某个包含极大文件的目录可能需要数小时甚至数天的时间。
  • 删除的文件中的所有内容都会丢失;如果删除了错误的表,就很难恢复。
  • 目录删除不是原子操作。 删除表时,某个读取表的并发查询可能会失败或看到的是部分表。

如果不需要更改表架构,则可以从 Delta 表中删除数据并插入新数据,或者通过更新表来纠正不正确的值。

如果要更改表架构,则能够以原子方式替换整个表。 例如: 。

Python

Python复制

dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .saveAsTable("<your-table>") # Managed table

dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .option("path", "<your-table-path>") \
  .saveAsTable("<your-table>") # External table

SQL

SQL复制

REPLACE TABLE <your-table> USING DELTA AS SELECT ... -- Managed table
REPLACE TABLE <your-table> USING DELTA LOCATION "<your-table-path>" AS SELECT ... -- External table

Scala

Scala复制

dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .saveAsTable("<your-table>") // Managed table

dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .option("path", "<your-table-path>")
  .saveAsTable("<your-table>") // External table

此方法有多个优点:

  • 覆盖表的速度要快得多,因为它不需要以递归方式列出目录或删除任何文件。
  • 表的旧版本仍然存在。 如果删除了错误的表,则可以使用“按时间顺序查看”轻松检索旧数据。 请参阅使用 Delta Lake 表历史记录。
  • 这是一个原子操作。 在删除表时,并发查询仍然可以读取表。
  • 由于 Delta Lake ACID 事务保证,如果覆盖表失败,则该表将处于其以前的状态。

此外,如果想要在覆盖表后删除旧文件来节省存储成本,可使用 VACUUM 来删除它们。 它针对文件删除进行了优化,通常比删除整个目录要快。

Spark 缓存

Databricks 不建议出于以下原因使用 Spark 缓存:

  • 丢失的任何数据跳过都可能归因于在缓存的 DataFrame 顶部添加的其他筛选器。
  • 如果使用其他标识符访问表,则可能不会更新缓存的数据。

Apache Spark 上的 Delta Lake 与 Parquet 之间的区别

Delta Lake 会自动处理以下操作。 不应手动执行以下操作:

  • REFRESH TABLE:Delta 表始终返回最新信息,因此无需在更改后手动调用 REFRESH TABLE
  • 添加和删除分区:Delta Lake 会自动跟踪表中存在的分区集,并在添加或删除数据时更新列表。 因此,无需运行 ALTER TABLE [ADD|DROP] PARTITION 或 MSCK
  • 加载单个分区:不需要直接读取分区。 例如,无需运行 spark.read.format("parquet").load("/data/date=2017-01-01")。 请改用 WHERE 子句来跳过数据,例如 spark.read.table("<table-name>").where("date = '2017-01-01'")
  • 不要手动修改数据文件:Delta Lake 使用事务日志自动提交对表的更改。 不要直接修改、添加或删除 Delta 表中的 Parquet 数据文件,因为这可能会导致数据丢失或表损坏。

提高 Delta Lake 合并的性能

可使用以下方法缩短合并所用的时间:

  • 减少匹配项的搜索空间:默认情况下,merge 操作会搜索整个 Delta 表以在源表中查找匹配项。 加速 merge 的一种方法是通过在匹配条件中添加已知约束来缩小搜索范围。 例如,假设你有一个由 country 和 date 分区的表,并且你希望使用 merge 更新最后一天和特定国家/地区的信息。 添加以下条件可加快查询速度,因为它仅在相关分区中查找匹配项:

    SQL复制

    events.date = current_date() AND events.country = 'USA'
    

    此外,该查询还会减少与其他并发操作发生冲突的机会。 有关更多详细信息,请参阅 Azure Databricks 上的隔离级别和写入冲突。

  • 压缩文件:如果数据存储在许多小文件中,则读取数据以搜索匹配项可能会变慢。 可以将小文件压缩为更大的文件,以提高读取吞吐量。 有关详细信息,请参阅优化数据文件布局。

  • 控制写入的随机分区merge 操作多次随机播放数据以计算和写入更新的数据。 用于随机排列的任务的数量由 Spark 会话配置 spark.sql.shuffle.partitions 控制。 设置此参数不仅可以控制并行度,还可以确定输出文件的数量。 增大该值可提高并行度,但也会生成大量较小的数据文件。

  • 启用优化写入:对于已分区表,merge 生成的小文件数量远大于随机分区的数量。 这是因为每个随机任务都可以在多个分区中写入多个文件,并可能成为性能瓶颈。 可以通过启用优化写入来减少文件数量。 请参阅 Azure Databricks 上的 Delta Lake 的优化写入。

  • 调整表中的文件大小:Azure Databricks 可以自动检测 Delta 表是否在频繁执行重写文件的 merge 操作,并可能会减小重写文件的大小,以备将来执行更多文件重写操作。 有关详细信息,请参阅有关调整文件大小的部分。

  • 低随机排列合并:低随机排列合并提供了 MERGE 的优化实现,可为大多数常见工作负载提供更好的性能。 此外,它还保留了现有的数据布局优化,例如对未修改数据的进行 Z 排序。

管理数据时效性

在每个查询开头,Delta 表自动更新到最新版本的表。 当命令状态报告 Updating the Delta table's state 时,可以在笔记本中观察到此过程。 但是,当对表运行历史分析时,你可能不需要最新的数据,尤其是在频繁引入流式处理数据的表中。 在这些情况下,可以在 Delta 表的过时快照上运行查询。 此方法可降低从查询获取结果的延迟时间。

可通过将 Spark 会话配置 spark.databricks.delta.stalenessLimit 设置为时间字符串值(例如 1h 或 15m,分别为 1 小时或 15 分钟),来配置对过期数据的容忍度。 此配置特定于会话,不会影响访问表的其他客户端。 如果表状态已在过期限制内更新,则针对表的查询将返回结果,而无需等待最新的表更新。 此设置永远不会阻止表更新,并且在返回过期数据时,会在后台进行更新。 如果最后一次表更新在过期期限之前,则查询不会返回结果,直到表状态更新完成为止。

用于低延迟查询的增强检查点

Delta Lake 以优化的频率将检查点写入增量表的聚合状态。 这些检查点作为计算表的最新状态的起点。 如果没有检查点,Delta Lake 就必须读取一个大型 JSON 文件(“delta”文件)的集合,表示提交到事务日志以计算表的状态。 此外,列级统计信息 Delta Lake 用于执行存储在检查点中的数据跳过操作。

 重要

Delta Lake 检查点与结构化流检查点不同。

列级统计信息存储为结构和 JSON(以实现后向兼容性)。 结构格式使得 Delta Lake 读取速度快得多,因为:

  • Delta Lake 不会执行昂贵的 JSON 分析来获取列级统计信息。
  • Parquet 列修剪功能可以显著减少读取列的统计信息所需的 I/O。

结构格式启用一系列优化,这些优化可以将增量 Delta Lake 读取操作的开销从数秒降低到数十毫秒,大大降低短查询的延迟。

在检查点中管理列级统计信息

使用表属性 delta.checkpoint.writeStatsAsJson 和 delta.checkpoint.writeStatsAsStruct 来管理如何在检查点中写入统计信息。 如果两个表属性都为 false,则 Delta Lake 无法执行跳过数据。

  • 批处理以 JSON 格式和结构格式编写写入统计信息。 delta.checkpoint.writeStatsAsJson 上声明的默认值为 true
  • delta.checkpoint.writeStatsAsStruct 在默认情况下是未定义的。
  • 读取器在可用时使用结构列,否则回退到使用 JSON 列。

 重要

增强的检查点不会破坏与开源 Delta Lake 读取器的兼容性。 但是,将 delta.checkpoint.writeStatsAsJson 设置为 false 可能会影响专有的 Delta Lake 读取器。 请与供应商联系,以了解有关性能影响的详细信息。

为结构化流式处理查询启用增强的检查点

如果结构化流式处理工作负载没有低延迟要求(即要求延迟在一分钟以内),你可运行以下 SQL 命令来启用增强的检查点:

SQL复制

ALTER TABLE [<table-name>|delta.`<path-to-table>`] SET TBLPROPERTIES
('delta.checkpoint.writeStatsAsStruct' = 'true')

可以通过设置以下表属性来降低检查点写入延迟:

SQL复制

ALTER TABLE [<table-name>|delta.`<path-to-table>`] SET TBLPROPERTIES
(
 'delta.checkpoint.writeStatsAsStruct' = 'true',
 'delta.checkpoint.writeStatsAsJson' = 'false'
)

如果跳过数据不适用于你的应用程序,可以将这两个属性都设置为 false, 这样就不会收集或写入任何统计信息。 Databricks 不建议使用此配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/800345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现将Nginx的每个网站配置单独的访问日志

一、问题描述 Nginx默认的访问日志是不会区分哪个网站有哪些日志的,全部糅杂在一起;如果需要哪个网站有哪些访问日志记录,还需要将访问日志下载下来后筛选,比较麻烦;希望将每个网站对应的日志能够单独记录到对应的日志文件里面,方便排查和管理。 # 进入Nginx默认的日志文…

FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题

其实代码没有问题&#xff0c;但是我们忽略了一个问题&#xff0c;就是在正常的开发中&#xff0c;肯定是遇到过这样的情况&#xff0c;我们频繁的有客户端链接&#xff0c;断开连接&#xff0c;需要统一的管理这些链接&#xff0c;那么应该如何管理呢。其实可以声明一个类去管…

Spring容器Bean之XML配置属性的细节

1、简单值注入使用&#xff1c;property&#xff1e;的value属性可以换一种写法 2、简单值注入使用&#xff1c;property&#xff1e;的value属性值中有些特殊的字符&#xff0c;比如< 、> 的时候可以用包裹 3、对象注入使用&#xff1c;property&#xff1e;的ref属性时…

二 GD32 MCU 烧录说明

GD32 MCU提供了多种烧录方法&#xff0c;可在调试和生产等阶段进行便捷的烧录。GD32目前主要烧录方法有ISP烧录、SWD/JTAG在线下载、脱机烧录三种类型。 ISP烧录&#xff1a;使用串口或USB即可烧录&#xff0c;无需特殊工具支持。可根据协议自行定制下载方式&#xff0c;需要控…

请你谈谈:AnnotatedBeanDefinitionReader 显式地注册一个Bean到Spring容器,以及注册并解析配置类

为了深入探讨Spring框架中的beanDefinition对象&#xff0c;我们不可避免地要提及BeanFactoryPostProcessor这一核心类&#xff0c;它作为Spring的bean工厂后置处理器发挥着关键作用。接下来&#xff0c;我们将详细讨论BeanFactoryPostProcessor的执行时机&#xff0c;这是一个…

人工智能 (AI) 应用:一个高精度ASD 诊断和照护支持系统

自闭症谱系障碍&#xff08;ASD&#xff09;是一种多方面的神经发育状况&#xff0c;影响全球大约1/100的儿童&#xff0c;而在中国&#xff0c;这一比例高达1.8%&#xff08;引用自《中国0&#xff5e;6岁儿童孤独症谱系障碍筛查患病现状》&#xff09;&#xff0c;男童为2.6%…

ns3-gym入门(三):在opengym基础上实现一个小小的demo

因为官方给的"opengym""opengym-2"这两个例子都很简单&#xff0c;所以自己改了一个demo&#xff0c;把reward-action-state相互影响的关系表现出来 一、准备工作 在ns3.35/scratch目录下创建一个文件夹&#xff1a; &#xff08;后续的运行指令后面都需要…

C++字体库开发之字符显示四

freetype提取路径&#xff0c;转svg显示 std::string FontPath::toSvg(const Segment &seg) const {if (seg.pts.empty())return "";std::ostringstream strStream;for (const auto &pt : seg.pts) {if (!strStream.view().empty())strStream << &quo…

【linux】服务器重装系统之系统盘写入准备

【linux】服务器重装系统之系统盘写入准备 【创作不易&#xff0c;求点赞关注收藏】&#x1f600; 文章目录 【linux】服务器重装系统之系统盘写入准备一、前期准备1、准备一个U盘&#xff0c;并进行格式化2、下载UltralSO工具3、下载对应的Ubuntu版本 二、写入操作教程 一、…

gorm多表联合查询 Joins方法 LEFT JOIN , RIGHT JOIN , INNER JOIN, FULL JOIN 使用总结

gorm中多表联合查询&#xff0c;我们可以使用Joins来完成&#xff0c;这个Joins方法很灵活&#xff0c;我们可以非常方便的多多表进行联合查询&#xff0c; 我们先来看看这个方法的官方定义和使用示例&#xff1a; Joins方法定义和使用示例 当然我们这里要说的使用方式是官方示…

nginx生成自签名SSL证书配置HTTPS

一、安装nginx nginx必须有"--with-http_ssl_module"模块 查看nginx安装的模块&#xff1a; rootecs-7398:/usr/local/nginx# cd /usr/local/nginx/ rootecs-7398:/usr/local/nginx# ./sbin/nginx -V nginx version: nginx/1.20.2 built by gcc 9.4.0 (Ubuntu 9.4.0…

Vue.js 中的 immediate: true的作用

在使用 Vue.js 时&#xff0c;监听器 (watchers) 是一种非常重要的工具&#xff0c;它允许我们观察和响应数据的变化。 immediate: true 的作用 默认情况下&#xff0c;监听器只有在所监视的数据属性发生变化时才会触发回调函数。然而&#xff0c;有时候我们需要在组件初始化时…

Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器

章节内容 上节我们完成了&#xff1a; ZNode的基本介绍ZNode节点类型的介绍事务ID的介绍ZNode实机测试效果 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff…

LVS+Nginx高可用集群---keepalived原理与实战

1.高可用集群架构keepalived双机主备原理 高可用&#xff1a;(HA) 部署nginx存在两台nginx。当主节点的nginx宕机停止服务的时候&#xff0c;nginx备用机起到跟nginx(主) keepalived的概念&#xff1a;解决单点故障&#xff1b;组件免费&#xff1b;可以实现高可用HA机制&…

《0基础》学习Python——第十一讲

一、lambda 匿名函数 lambda函数是一种匿名函数。它是一种快速定义单行函数的方法。与常规函数不同&#xff0c;lambda函数没有名称&#xff0c;也没有使用def关键字来定义。lambda函数通常用于一些简单的函数&#xff0c;可以在代码中快速定义和使用&#xff0c;而不需要为其定…

Hive的基本操作(查询)

1、基础查询 基本语法 select 字段列表|表达式|子查询 from 表(子查询|视图|临时表|普通表) where [not] 条件A and|or 条件B --先&#xff1a;面向原始行进行筛选 group by 字段A[,字段B,...] > 分组【去重处理】 having 聚合条件(非原始字段条件) --再&#x…

《梦醒蝶飞:释放Excel函数与公式的力量》12.3 DMIN函数

第12章&#xff1a;数据库函数 第三节 12.3 DMIN函数 12.3.1 简介 DMIN函数是Excel中的一个数据库函数&#xff0c;用于返回数据库或数据表中特定条件下某字段的最小值。DMIN函数在处理大规模数据、数据筛选和分析时非常有用。 12.3.2 语法 DMIN(database, field, criteri…

MYSQL 四、mysql进阶 9(数据库的设计规范)

一、为什么需要数据库设计 二、范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的…

LLM量化--AWQ论文阅读笔记

写在前面&#xff1a;近来大模型十分火爆&#xff0c;所以最近开启了一波对大模型推理优化论文的阅读&#xff0c;下面是自己的阅读笔记&#xff0c;里面对文章的理解并不全面&#xff0c;只将自己认为比较重要的部分摘了出来&#xff0c;详读的大家可以参看原文 原论文地址&am…

Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题&#xff08;143&#xff09; Leetcode—146. LRU 缓存 先验知识 list & unordered_map 实现代码 struct Node{int key;int value;Node(int key, int value): key(key), value(value) {} };class LRUCache { public:LRUCache(int capacity): m_capacity(capa…