命名空间概念¶
命名空间定义¶
Lance 命名空间是一个集中式存储库,用于发现、组织和管理 Lance 表。它既可以包含一组表,也可以递归地包含一组 Lance 命名空间。它旨在封装诸如命名空间、元数据存储、数据库、模式等概念,这些概念在其他类似数据系统中经常出现,以便于与任何具有任何类型对象层次结构的系统进行轻松集成。
以下是 Lance 命名空间的一个示例布局
父级与子级¶
我们使用术语 **父级** 和 **子级** 来描述两个对象之间的关系。如果命名空间 A 直接包含 B,则 A 是 B 的父命名空间,即 B 是 A 的子级。例如:
- 命名空间
ns1
包含一个 **子命名空间**ns4
。即ns1
是ns4
的 **父命名空间**。 - 命名空间
ns2
包含一个 **子表**t2
,即t2
属于 **父命名空间**ns2
。
根命名空间¶
根命名空间是没有父级的命名空间。根命名空间被假定为始终存在,并且可以通过工具连接到它以探索命名空间中的对象。根命名空间的生命周期管理(例如创建、删除)不属于本规范的范围。
对象名称¶
对象的 **名称** 是一个字符串,它在其所属的父命名空间中唯一标识该对象。任何对象的名称在其所有共享相同父命名空间的其他对象中必须是唯一的。例如:
cat2
、cat3
和cat4
都是根命名空间下的唯一名称t3
和t4
都是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 个命名空间 ns1
和 ns4
,而 t2
在根目录之前有 1 个命名空间 ns2
。