跳到内容

命名空间概念

命名空间定义

Lance 命名空间是一个集中式存储库,用于发现、组织和管理 Lance 表。它既可以包含一组表,也可以递归地包含一组 Lance 命名空间。它旨在封装诸如命名空间、元数据存储、数据库、模式等概念,这些概念在其他类似数据系统中经常出现,以便于与任何具有任何类型对象层次结构的系统进行轻松集成。

以下是 Lance 命名空间的一个示例布局

Lance namespace layout

父级与子级

我们使用术语 **父级** 和 **子级** 来描述两个对象之间的关系。如果命名空间 A 直接包含 B,则 A 是 B 的父命名空间,即 B 是 A 的子级。例如:

  • 命名空间 ns1 包含一个 **子命名空间** ns4。即 ns1ns4 的 **父命名空间**。
  • 命名空间 ns2 包含一个 **子表** t2,即 t2 属于 **父命名空间** ns2

根命名空间

根命名空间是没有父级的命名空间。根命名空间被假定为始终存在,并且可以通过工具连接到它以探索命名空间中的对象。根命名空间的生命周期管理(例如创建、删除)不属于本规范的范围。

对象名称

对象的 **名称** 是一个字符串,它在其所属的父命名空间中唯一标识该对象。任何对象的名称在其所有共享相同父命名空间的其他对象中必须是唯一的。例如:

  • cat2cat3cat4 都是根命名空间下的唯一名称
  • t3t4 都是 cat4 下的唯一名称

对象标识符

对象的 **标识符** 在其所属的根命名空间中唯一标识该对象。任何对象的标识符在其所有共享相同根命名空间的其他对象中必须是唯一的。

基于对象名称在其父命名空间中的唯一性,对象标识符是从根命名空间(不包括)到对象本身(包括)的对象名称列表。这也称为 **列表样式标识符**。例如:

  • cat5 的列表样式标识符是 [cat2, cat5]
  • t1 的列表样式标识符是 [cat2, cat5, t1]

点(.)符号通常用作分隔符,将所有名称连接起来形成 **字符串样式标识符**,但如果对象名称中使用点,也可以使用其他符号。例如:

  • cat5 的字符串样式标识符是 cat2.cat5
  • t1 的字符串样式标识符是 cat2.cat5.t1
  • 当使用分隔符 $ 时,t3 的字符串样式标识符是 cat4$t3

根命名空间的名称和标识符

根命名空间本身没有名称或标识符。当在代码中表示时,其名称和字符串样式标识符由空字符串或 null 字符串表示,其列表样式标识符由空列表或 null 列表表示。

根命名空间的实际名称和标识符通常由用户在使用工具时通过一些配置分配。例如,在 Ray 中,根命名空间可以称为 cat1,但在 Apache Spark 中可以称为 cat2,并且它们都被配置为连接到同一个根命名空间。

对象级别

根命名空间始终位于级别 0。这意味着如果一个对象的列表样式标识符的列表大小为 N,则该对象位于整个命名空间层次结构中的第 N 级。我们也称该对象标识符具有 N 个级别。例如,命名空间 [ns1, ns2] 位于级别 2,标识符 ns1.ns2 具有 2 个级别。表 [catalog1, database2, table3] 位于级别 3,标识符 catalog1.database2.table3 具有 3 个级别。

分级命名空间

如果根命名空间中的每个表都位于相同的级别 N,则该命名空间称为 **分级**,我们称该命名空间为 N 级命名空间。例如,目录命名空间是 1 级命名空间,Hive 2.x 命名空间是 2 级命名空间。上面的示例不是分级的,因为 t1 在根目录之前有 2 个命名空间 ns1ns4,而 t2 在根目录之前有 1 个命名空间 ns2