何时在Databricks上对表进行分区

本文概述了如何在Databricks上对表进行分区,以及何时应该对Delta Lake支持的表使用分区的具体建议。由于内置的特性和优化,大多数数据小于1tb的表不需要分区。

在Databricks Runtime 8.4及以上版本中,Databricks默认对所有表使用Delta Lake。以下建议假设您正在使用Delta Lake处理所有表。

在Databricks Runtime 11.2及以上版本中,Databricks会根据摄取时间自动将未分区表中的数据聚类。看到使用摄入时间聚类

小表需要分区吗?

Databricks建议不要对数据小于1tb的表进行分区。

表中每个分区的最小大小是多少?

Databricks建议所有分区至少包含1gb的数据。具有较少较大分区的表的性能优于具有许多较小分区的表。

使用摄入时间聚类

通过使用Delta Lake和Databricks Runtime 11.2或更高版本,您创建的无分区表将自动从中受益摄食时间聚类.摄取时间提供了与基于datetime字段的分区策略类似的查询优势,而不需要优化或调优数据。

请注意

在执行大量修改时,使用更新合并语句,Databricks建议运行优化ZORDER通过使用与摄取顺序匹配的列。例如,这可以是包含事件时间戳或创建日期的列。

Delta Lake分区与其他数据湖中的分区有何不同?

虽然Databricks和Delta Lake构建在Apache Spark、Parqbob下载地址uet、Hive和Hadoop等开源技术之上,但在这些技术中有用的分区动机和策略通常并不适用于Databricks。如果你选择分区你的表,在选择策略之前考虑以下事实:

  • 事务不是由分区边界定义的。三角洲湖确保通过事务日志,因此不需要通过分区分隔一批数据来确保原子发现。

  • 数据库计算集群不具有与物理介质绑定的数据局部性。输入湖屋的数据存储在云对象存储中。在数据处理期间,数据被缓存到本地磁盘存储,Databricks使用基于文件的统计数据来确定并行加载的最小数据量。

Z-order和分区是如何一起工作的?

你可以使用z值在分区旁边建立索引以加快对大型数据集的查询。

请注意

大多数表格都可以利用摄食时间聚类以避免需要担心z轴顺序和分区调优。

在基于分区边界和z轴顺序规划查询优化策略时,请务必记住以下规则:

  • z轴顺序与优化命令。您不能跨分区边界组合文件,因此z顺序聚类只能发生在分区内。对于未分区的表,可以跨整个表组合文件。

  • 分区只适用于基数低或已知的字段(例如日期字段或物理位置),而不适用于基数高的字段(例如时间戳)。z顺序适用于所有字段,包括高基数字段和可能无限增长的字段(例如,时间戳或交易或订单表中的客户ID)。

  • 不能对用于分区的字段进行z轴排序。

如果分区这么糟糕,为什么有些Databricks特性还要使用分区呢?

分区可能是有益的,特别是对于非常大的表。围绕分区的许多性能增强都集中在非常大的表(数百tb或更大)上。

许多客户从基于parquet的数据湖迁移到Delta Lake。的转换δ语句允许您将现有的基于parquet的表转换为Delta表,而无需重写现有数据。因此,许多客户拥有继承以前分区策略的大表。Databricks开发的一些优化在可能的情况下寻求利用这些分区,减轻了未针对Delta Lake优化的分区策略的一些潜在缺点。

Delta Lake和Apache Spark是开源技术。当Databricks继续引入减少对分区依赖的特性时,开源社区可能会继续构建增加复杂性的新特性。bob下载地址

它是可能超越Databricks内置优化自定义分区?

一些有经验的Apache Spark和Delta Lake用户可能能够设计和实现一种提供更好性能的模式摄食时间聚类.实现糟糕的分区策略可能会对下游性能产生非常负面的影响,可能需要完全重写数据才能修复。Databricks建议大多数用户使用默认设置,以避免引入昂贵的低效率。