大数跨境
0
0

使用 Lance Namespace和 Spark 管理任意Catalog中的 Lance 表

使用 Lance Namespace和 Spark 管理任意Catalog中的 Lance 表 Lance & LanceDB
2025-11-26
0

原文地址:https://lancedb.com/blog/introducing-lance-namespace-spark-integration/


原文作者:Jack Ye


在人工智能和分析工作流程中,数据管理通常需要处理多个系统和格式。今天,我们很高兴推出 Lance Namespace这是一项开放规范,旨在标准化对 Lance 表集合的访问,使得将 Lance 集成到现有数据基础设施中变得比以往更加简单。



什么是 Lance Namespace?


Lance Namespace 是一种基于存储的 Lance 表和文件格式之上的开放规范。


它为元数据服务(如 Apache Hive MetaStore、Apache Gravitino、Unity Catalog、AWS Glue Data Catalog 等)提供了一种标准化的方式来存储和管理 Lance 表。


这意味着您可以将 Lance 表无缝地与现有的数据湖仓(Data Lakehouse)基础设施结合使用。


💡 为什么选择“Namespace”而不是“Catalog”?


在传统的数据湖领域,通常使用层级结构(如目录、数据库和表)来组织数据,而在机器学习(ML)和人工智能(AI)社区中,更倾向于使用扁平化的组织模型,例如简单的目录结构。


Lance Namespace 通过提供多级命名空间抽象,灵活适应您的数据组织策略,无论是简单的目录结构还是复杂的多级层次结构,都能很好地支持。



实现和构建


Lance Namespace 目前支持以下几种开箱即用的实现方式:


1. 目录命名空间(Directory Namespace)基于简单文件的组织方式。


2. REST 命名空间(REST Namespace)连接到任何符合 REST 规范的服务器,包括 LanceDB Cloud 和 LanceDB Enterprise

https://lancedb.com/pricing/


3. Hive 2.x 和 3.x MetaStore与 Apache Hive 的集成。


4. AWS Glue Catalog原生支持 AWS Glue。


💡 构建自定义命名空间


您可以通过以下两种方式构建自己的命名空间实现:


1. REST 服务器实现 Lance REST Namespace 的 OpenAPI 规范,创建一个标准化的服务器,供任何 Lance 工具连接使用。


2. 原生实现直接构建一个作为库的实现。


在决定是构建一个适配器(REST 服务器代理到您的元数据服务)还是进行原生实现时,您需要考虑以下因素:


多语言支持需求、工具兼容性、安全性要求、性能敏感性。详细的决策指导,请参阅 Lance REST Namespace 文档,以帮助您选择最适合的实现方式。

https://lance.org/format/namespace/impls/rest/#choosing-between-an-adapter-vs-an-implementation



Apache Spark集成


在 Lance 社区中,Lance Namespace 实现的一个备受期待的功能是与 Apache Spark 的无缝集成。


这不仅使 Lance 成为一种数据格式插件,还将其扩展为一个完整的 Spark 表目录(Table Catalog)。


通过这种集成,用户可以在 Spark 中访问和管理 Lance 表,运行标准的 SQL 分析,并在训练过程中使用 Spark MLlib。


以下是如何通过 Lance Namespace 实现与Spark的集成。



Getting Started


让我们通过一个简单的示例,演示如何使用 Lance Namespace 与 Spark 来管理和查询 Lance 表。


如果您希望快速开始,我们已经准备了一个预配置的 Docker 镜像,从而无需担心复杂的设置。请查看我们的 Lance Spark Connector 快速入门指南,几分钟内即可开始使用。

https://lance.org/integrations/spark/#quick-start


💡 第一步:设置 Spark 会话


首先,使用 Lance Namespace 目录配置 Spark。以下是一个基于目录命名空间的示例:

from pyspark.sql import SparkSession# 创建一个带有 Lance 目录的 Spark 会话spark = SparkSession.builder \    .appName("lance-namespace-demo") \    .config("spark.jars.packages""com.lancedb:lance-spark-bundle-3.5_2.12:0.0.6") \    .config("spark.sql.catalog.lance""com.lancedb.lance.spark.LanceNamespaceSparkCatalog") \    .config("spark.sql.catalog.lance.impl""dir") \    .config("spark.sql.catalog.lance.root""/path/to/lance/data") \    .config("spark.sql.defaultCatalog""lance") \    .getOrCreate()


以上代码创建了一个名为 lance 的 Spark catalog,并配置为与 /path/to/lance/data 目录进行交互。同时,它将 lance 设置为当前 Spark 会话中的默认catalog。


💡 第二步:创建和管理表


配置好目录后,您可以使用熟悉的 SQL 命令创建和管理 Lance 表:

# 创建一个 Lance 表spark.sql("""    CREATE TABLE embeddings (        id BIGINT,        text STRING,        embedding ARRAY<FLOAT>,        timestamp TIMESTAMP    )    TBLPROPERTIES (      'embedding.arrow.fixed-size-list.size'='3'    )""")# 向表中插入数据spark.sql("""    INSERT INTO embeddings     VALUES         (1, 'Hello world', array(0.1, 0.2, 0.3), current_timestamp()),        (2, 'Lance and Spark', array(0.4, 0.5, 0.6), current_timestamp())""")


注意,当用户通过 表属性 'embedding.arrow.fixed-size-list.size'='3' 指定嵌入列 embedding ARRAY<FLOAT> 时,它会在底层 Lance 格式表中创建一个固定大小的向量列。这种设计优化了向量搜索的性能。


💡 第三步:查询数据


像查询其他 Spark 表一样查询 Lance 表:

# 使用 SQL 查询results = spark.sql("""    SELECT id, text, size(embedding) as dim    FROM embeddings    WHERE id > 0""")results.show()# 或使用 DataFrame APIdf = spark.table("embeddings")filtered_df = df.filter(df.id > 0).select("id""text")filtered_df.show()


💡 第四步:与机器学习工作流集成


Lance 的列式格式和向量支持使其非常适合机器学习工作流:

from pyspark.sql import functions as F# 模拟生成新的embeddingnew_embeddings_df = spark.sql("""    SELECT         3 as id,        'Machine learning with Lance' as text,        array(0.7, 0.8, 0.9) as embedding,        current_timestamp() as timestamp    UNION ALL    SELECT         4 as id,        'Vector databases are fast' as text,        array(0.2, 0.4, 0.6) as embedding,        current_timestamp() as timestamp""")# 将新的embedding追加到 Lance 表中new_embeddings_df.writeTo("embeddings").append()# 验证合并后的数据集并计算embedding统计spark.sql("""    SELECT         COUNT(*) as total_records,        ROUND(AVG(aggregate(embedding, 0D, (acc, x) -> acc + x * x)), 3) as avg_l2_norm,        ROUND(MIN(embedding[0]), 2) as min_first_dim,        ROUND(MAX(embedding[0]), 2) as max_first_dim    FROM embeddings""").show()


💡高级配置


以下是一些用于连接不同 Lance Namespace 实现的配置示例:


1. 基于 S3 云存储的目录命名空间

spark = SparkSession.builder \    .config("spark.sql.catalog.lance.impl""dir"\    .config("spark.sql.catalog.lance.root""s3://bucket/lance-data"\    .config("spark.sql.catalog.lance.storage.access_key_id""your-key"\    .config("spark.sql.catalog.lance.storage.secret_access_key""your-secret"\    .getOrCreate()


2. LanceDB Cloud REST 命名空间

spark = SparkSession.builder \    .config("spark.sql.catalog.lance.impl""rest"\    .config("spark.sql.catalog.lance.uri""https://your-database.api.lancedb.com"\    .config("spark.sql.catalog.lance.headers.x-api-key""your-api-key"\    .getOrCreate()


3. AWS Glue命名空间

spark = SparkSession.builder \    .config("spark.sql.catalog.lance.impl""glue"\    .config("spark.sql.catalog.lance.region""us-east-1"\    .config("spark.sql.catalog.lance.root""s3://your-bucket/lance"\    .getOrCreate()


对 AI 和分析团队的优势


通过将 Lance Namespace 与 Spark 集成,可以为 AI 和分析团队带来以下关键优势:


1. 统一的数据管理:可以将 Lance 表与现有的数据资产一起管理,实现数据管理的统一化。


2. 灵活性:根据您的基础设施选择适合的命名空间后端(如目录、REST 或 AWS Glue)。


3. 高性能:利用 Lance 的表和文件格式,与 Spark 的分布式处理能力相结合,提升性能。


4. 简易性:使用熟悉的 SQL 和 DataFrame API,无需学习新的工具或语言。


5. 可扩展性:从本地实验到生产级工作负载,均能轻松处理,满足不同规模的需求。


如需了解更多关于 LanceDB 的功能和能力,请查看我们的文档。

https://lancedb.com/docs/



下一步规划


Lance Namespace 旨在成为可扩展且由社区驱动的解决方案。我们正在积极推进以下工作:


1. 更多命名空间实现:正在开发对 Unity Catalog、Apache Gravitino 和 Apache Polaris 的支持。


2. 增强 Spark 中的向量搜索能力。


3. 与机器学习框架的更紧密集成,例如引入数据演化(Data Evolution)。


4. 除Spark外,还要支持更多计算引擎。


如果您有兴趣开始使用LanceDB 或探索我们的企业级特性,我们提供了全面的指南供您参考。

https://lancedb.com/docs/quickstart/



感谢我们的贡献者


我们衷心感谢为 Lance Namespace 和 Spark 集成做出贡献的社区成员:


1. Bryan Keller(来自 Netflix)

2. Drew Gallardo(来自 AWS)

3. Jinglun 和 Vino Yang(来自字节跳动)


您们的贡献对于将 Lance Namespace 打造成一个强大的社区解决方案起到了至关重要的作用。



加入


Lance Namespace 是开源的,我们欢迎各种形式的贡献!


无论您是想添加新的命名空间实现、改进 Spark 连接器、构建与更多计算引擎的集成,还是只是尝试使用,我们都非常期待您的参与。


Lance Namespace 文档:

https://lance.org/format/namespace/


Lance Spark Connector 文档:

https://lance.org/integrations/spark/


Lance Namespace 路线图:

https://github.com/lance-format/lance-namespace/issues/168


Lance Spark Connector 路线图:

https://github.com/lance-format/lance-spark/issues/47



总结


Lance Namespace 架起了现代 AI 工作负载与传统数据基础设施之间的桥梁。通过提供管理 Lance 表的标准化方式以及与 Apache Spark 的无缝集成,它让构建可扩展的 AI 和分析 工作流变得前所未有的简单。


今天就试试吧!无论您是在构建推荐系统、管理 RAG 应用程序 的嵌入数据,还是分析大规模数据集,Lance Namespace 和 Spark 都为您提供了成功所需的坚实基础。


我们期待听到您的反馈!


推荐阅读

图片

图片  点击阅读原文,跳转LanceDB GitHub 

【声明】内容源于网络
0
0
Lance & LanceDB
欢迎关注 Lance & LanceDB 技术公众号!Lance 是开源多模态数据湖格式,支持快速访问与高效存储。基于其构建的 LanceDB 是无服务器向量数据库。我们聚焦技术解读、实战案例,助你掌握 AI 数据湖前沿技术。
内容 19
粉丝 0
Lance & LanceDB 欢迎关注 Lance & LanceDB 技术公众号!Lance 是开源多模态数据湖格式,支持快速访问与高效存储。基于其构建的 LanceDB 是无服务器向量数据库。我们聚焦技术解读、实战案例,助你掌握 AI 数据湖前沿技术。
总阅读9
粉丝0
内容19