查询类型(Query Types)

Apache Hudi支持的三种查询类型:

  • Snapshot查询:这种查询方式用于查询数据集的某个时间点的快照,类似于传统的批处理查询方式。它适用于需要对数据集进行一次性的全面查询的场景。

  • Incremental查询:这种查询方式用于查询数据集的增量更新,它只查询从上一次查询以来的新数据,避免了重复查询已经查询过的数据。这种查询方式适用于需要查询数据集的增量更新的场景。

  • Read Optimized查询:这种查询方式用于查询数据集的最新视图,并且它可以提供最佳的查询性能。它适用于需要查询最新数据的场景,例如实时数据仓库和在线分析处理(OLAP)等应用。

Snapshot查询

Apache Hudi的Snapshot查询支持两种不同的数据写入模式:MOR(Merge on Read)和COW(Copy on Write)。它们在查询快照时有一些细微的差别。

image.png

  • MOR表查询

在MOR模式下,Hudi在写入时将数据写入到可变的数据文件中,这些文件称为日志文件。当文件大小达到一定阈值时,Hudi会将这些日志文件归档到一个不可变的数据文件中。这些不可变的数据文件称为快照文件。因此,在MOR模式下,Hudi的查询快照实际上是查询这些快照文件。

由于MOR表的数据文件是可变的,因此如果一个数据文件中的数据被更新,那么这个更新不会影响已经归档为快照文件的数据文件。因此,在查询MOR表的快照时,Hudi需要同时查询所有的数据文件和快照文件,以确保查询结果的正确性。

  • COW表查询

在COW模式下,Hudi在写入时将数据写入到不可变的数据文件中,这些文件称为快照文件。当有更新发生时,Hudi会将更新写入一个新的数据文件中,并将这个新的数据文件作为新的快照文件。因此,在COW模式下,Hudi的查询快照实际上是查询这些快照文件。

由于COW表的数据文件是不可变的,因此如果一个数据文件中的数据被更新,那么这个更新会生成一个新的数据文件,而不是更新原始的数据文件。因此,在查询COW表的快照时,Hudi只需要查询最新的快照文件即可,不需要查询旧的数据文件。这种方式可以提高查询性能。

总的来说,MOR表和COW表的查询快照方式略有不同。在MOR模式下,需要同时查询所有数据文件和快照文件,以确保查询结果的正确性;而在COW模式下,只需要查询最新的快照文件即可,可以提高查询性能。

Incremental 查询

对于MOR表,增量查询可以直接在Hudi数据集中运行。这种查询类型可以在Hudi数据集中基于增量数据执行查询。MOR表中,每个数据文件都包含了最近一次写操作之后的所有更改。这意味着,如果在两个查询之间执行了一些写操作,则下一个查询将只考虑这些更改,并自动过滤掉之前的数据。

对于COW表,增量查询需要从历史数据中进行计算。在这种情况下,Apache Hudi需要将之前的数据文件加载到内存中,并计算增量数据。

Range 查询

image.png 对于MOR表,可以使用时间戳或者Hudi记录中的默认时间戳进行Range查询,以查询特定时间范围内的数据。Apache Hudi会自动选择包含所需时间范围的文件版本,并返回该时间范围内的数据。

对于COW表,同样可以使用时间戳或默认时间戳进行Range查询。但由于COW表在每次写操作中都会创建一个全新的文件版本,因此Apache Hudi需要加载所有历史数据,并计算出特定时间范围内的数据。在这种情况下,COW表的查询时间可能会比MOR表更长。

区别

查询类型 查询延迟 数据延迟
Snapshot Queries(MOR表)
Snapshot Queries(COW表)
Incremental Queries(MOR表)
Incremental Queries(COW表)
Range Queries(MOR表)
Range Queries(COW表)

解释:

  1. Snapshot Queries: 在MOR表和COW表中,Snapshot查询具有低查询延迟和数据延迟,因为它可以直接在最新的文件版本中查找数据,并返回特定时间点的数据快照。这种查询类型不需要计算增量数据或历史数据,因此延迟较低。
  2. Incremental Queries: 在MOR表中,增量查询具有较低的查询延迟,因为它可以直接在Hudi数据集中运行,并自动过滤掉之前的数据,只考虑增量数据。但是,由于需要计算增量数据,因此在数据延迟方面可能会较高。在COW表中,增量查询需要从历史数据中进行计算,因此查询延迟和数据延迟都可能会比MOR表更高。
  3. Range Queries: 在MOR表和COW表中,Range查询具有低查询延迟,因为它可以自动选择包含所需时间范围的文件版本,并返回该时间范围内的数据。这种查询类型不需要计算增量数据或历史数据,因此延迟较低。但是,在COW表中,由于需要加载所有历史数据并计算特定时间范围内的数据,因此数据延迟可能会比MOR表更高。

因此,根据上述表格,可以看出每种查询类型的优缺点,具体取决于应用程序需要进行哪种类型的查询。