注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。
本页面涵盖了关于数据集投影在实践中如何工作的高级细节,以便在数据集上实现更优化的查询。要了解更高层次的投影,请参阅此页面。
在内部,投影是数据集的一个副本,优化为某种访问模式。Foundry 将数据集上的投影存储为子数据集。这些被称为“投影”数据集。父数据集被称为“规范”或“投影”数据集。
搭建 使投影与主数据集中最新的数据保持同步。如果投影不是最新的,它仍然会被使用。然而,它可能不会提供太多好处。
如果投影数据集收到一个新的 SNAPSHOT
事务,任何下游投影都完全过时,并且在项目重建之前没有任何好处。如果投影数据集收到一个 APPEND
事务,下游投影只相对于新事务局部过时。Foundry 查询会被重写,以便在可能的情况下从投影中获益,同时仍然生成反映新数据的结果。
在低层级上,投影是:
投影数据集存储为一个Foundry 数据集。此数据集不可见为一个资源,但可以通过 Projections
选项卡中的链接访问。
为了保持其最新状态,投影通过正常的 Foundry 搭建系统异步搭建。这使得用户在搭建后可以一致和立即地读取投影数据集,但投影数据集必须定期搭建以防止过时。
为了在分配计算资源和控制成本方面提供灵活性,Foundry 不会自动创建这些搭建。要配置它们,请使用 Projections
选项卡中的调度器微件。
没有适当搭建节奏的通用规则。主要决定因素是查询需要能够在数据集的未投影部分内执行以达到其性能目标。例如,如果您的管道每小时写入 10 GB,并且您确定筛选读取应扫描不超过 100 GB 以达到您的性能目标,您应该确保投影至少每 10 小时搭建一次。
投影使用自动扩展机制来寻找合适的执行器数量以搭建投影。除非投影搭建失败或耗时过长,否则您无需手动调整 Spark 配置文件。
Foundry 将把与投影相关的任何成本(例如其存储和计算)归因于主数据集的项目。
压缩是投影上执行的主要维护操作。它指的是将大量小型排序文件合并为更大的排序文件的过程。压缩作为投影搭建过程的一部分自动发生在投影上。
压缩使读取性能独立于主数据集上的输入事务数量。这允许投影加速频繁增量写入或流式数据集的读取。投影搭建可能偶尔运行时间超过平均水平。这通常是由于压缩造成的。
如果可以利用投影满足查询,它将始终在主数据集之前被选中,即使主数据集的写入方式在其他情况下可能更优化以支持给定查询。这极大地简化了查询计划的语义。
对于以下查询,在查询计划过程中对各种投影分配的优先级如下:
x = 1 AND y = 2
,投影将按以下优先级选择:
x
和 y
上x
和 y
上(并在任何列集上进行分桶)x
上x
上(并在任何列集上进行分桶)F
上进行筛选并在列 J
上进行合并,投影将按以下优先级选择:
J
上分桶并在列 F
上局部排序的投影F
上全局排序的投影F
上局部排序的投影(并在除了列 J
之外的任何列上进行分桶)J
上分桶的投影(并在除了列 F
之外的任何列上局部排序)这些优先级反映了这样一种观点,即筛选通常足够具有选择性,因此优化筛选比合并更好,尽管这可能并不总是如此。