跳转到内容

常见问题

注意

本文档涵盖多个主题区域 - 请参阅右侧的目录以获取更多信息。

产品

什么是 ArcticDB?

ArcticDB 是一个高性能的 DataFrame 数据库,专为现代 Python 数据科学生态系统构建。ArcticDB 是一个嵌入式数据库引擎 - 这意味着安装 ArcticDB 就像安装一个 Python 包一样简单。这也意味着 ArcticDB 不需要任何服务器基础设施即可运行。

ArcticDB 针对包含数百万行和列的数值数据集进行了优化,使您能够在一个研究人员、数据科学家和软件工程师都能立即熟悉的 Pythonic、类似 DataFrame 的 API 中存储和检索海量数据集。

ArcticDB 与 GitHub 上的 Arctic 版本有何不同?

请参阅历史页面

ArcticDB 与 Apache Parquet 有何不同?

ArcticDB 和 Parquet 都支持存储列式数据,无需额外基础设施。

然而,ArcticDB 使用自定义存储格式,这意味着它比 Parquet 提供了以下功能:

  • 版本化修改(“时间旅行”)- ArcticDB 是双时态的。
  • 时间序列索引。ArcticDB 是一个时间序列数据库,因此针对包含数十亿行的时间序列数据的切片和处理进行了优化。
  • 数据发现 - ArcticDB 专为团队构建。数据被组织到库和符号中,而不是原始文件路径。
  • 支持流式数据。ArcticDB 是一个功能齐全的流式/tick 数据库,能够存储批量数据和流式数据。
  • 支持“动态 Schema” - ArcticDB 支持随着时间变化 Schema(列集)的数据集。
  • 支持自动数据去重。

ArcticDB 最适合哪种数据?

ArcticDB 是一个 OLA(分析型)P DBMS,而不是 OLT(事务型)P DBMS。

实际上,这意味着 ArcticDB 针对大型数值数据集以及一次操作多行数据的查询进行了优化。

ArcticDB 需要服务器吗?

不需要。ArcticDB 是一个功能齐全的嵌入式分析型数据库系统,专为现代云和本地对象存储设计,核心功能无需服务器。

我可以使用哪些语言来使用 ArcticDB?

目前仅提供 Python 的绑定。

将数据保存到 ArcticDB 的最佳实践是什么?

用户应根据其特定用例考虑如何存储数据。请参阅此处的指南。

ArcticDB 作为客户端的限制是什么?

ArcticDB 的无服务器特性提供了出色的性能,使其成为对速度和效率至关重要的数据科学应用的理想选择。它确保了原子性、一致性和持久性,但不隔离事务。对符号的更改遵循后写者优先(last-writer-wins)原则,并且在没有隔离的情况下,不支持先读后写的事务,这不适用于需要强事务保证的用例。

ArcticDB 支持哪些存储选项?

ArcticDB 支持多种本地和云端存储选项。已验证可与多种存储系统配合使用,例如 AWS S3、Azure Blob Storage、LMDB、内存、Ceph、MinIO (Linux)、Pure Flashblade S3、Scality S3 和 VAST Data S3,并计划很快支持更多选项。

ArcticDB 版本控制的权衡是什么?

ArcticDB 默认对数据进行版本控制,支持时间点分析和高效数据更新,包括每日追加和历史修正,使其成为研究数据集的理想选择。数据库能够对版本之间未更改的数据进行去重,有效利用存储空间。ArcticDB 企业工具包括数据修剪和压缩,有助于在创建新版本时管理存储和数据碎片。存储大量数据版本确实需要更多存储空间。

更多信息请参见此处

ArcticDB 支持哪种粒度的授权?

认证在存储账户级别进行,授权可以针对大多数 S3 后端在 ArcticDB 库级别进行(具有目录/路径权限),否则也在存储账户级别进行。后端有许多第三方认证和授权集成可用。

ArcticDB 数据如何被编目并被消费者发现?

ArcticDB 提供列出库和符号的功能,包括元数据。您可以使用这些功能发现和浏览存储在 ArcticDB 中的数据。

如何开始使用 ArcticDB?

请参阅我们的入门指南

技术

ArcticDB 使用 SQL 吗?

不。ArcticDB 使用一个 Python API 来实现数据访问和修改,该 API 使用 Pandas DataFrames 的概念。详情请参阅参考文档。

ArcticDB 会对数据进行去重吗?

是的。

每次 write 时,ArcticDB 会检查您正在写入的符号的上一个版本(并且检查此版本 - 不会扫描其他符号!),并跳过写入相同的分段。但请记住,这在版本 n 等于版本 n-1 加上末尾的附加数据时最有效 - 并且仅在末尾!如果在中间插入了附加数据,则在该修改之后出现的所有分段几乎肯定会不同。ArcticDB 以固定间隔对数据进行分段,并且仅当数据分段的哈希值相同时才进行去重 - 因此,一行偏移将阻止有效的去重。

请注意,这是一个库配置选项,默认情况下是关闭的,有关如何启用它,请参阅help(LibraryOptions)

ArcticDB 如何实现高级分析?

ArcticDB 主要侧重于从存储中过滤数据并将其传输到内存 - 然后可以使用 Pandas、NumPy 或其他标准分析包进行分析。

尽管如此,ArcticDB 确实提供了一组有限的分析函数,这些函数在 C++ 存储引擎内部执行,相比 Pandas 提供了显著的性能优势。更多信息请参阅 LazyDataFrameLazyDataFrameCollectionQueryBuilder 类的文档

Pickling 是什么意思?

ArcticDB 有两种存储数据的方式:

  1. ArcticDB 可以使用Arctic 磁盘存储格式来存储您的数据。
  2. ArcticDB 可以对您的数据进行 Pickle,将其存储为一个巨大的二进制大对象(blob)。

(1) 的性能要高得多(即读写速度更快),空间效率更高,并支持入门指南中描述的数据切片。将数据存储为 Pickled 二进制大对象没有任何实际优势 - 除非某些数据类型必须经过 Pickle 才能被 ArcticDB 存储!

ArcticDB 原生仅支持存储以下数据类型:

  1. Pandas DataFrames
  2. NumPy 数组
  3. 整数(包括时间戳 - 但时间戳中的时区信息会被移除)
  4. 浮点数
  5. 布尔值
  6. 字符串(作为 DataFrame/NumPy 数组的一部分写入)

请注意,ArcticDB 无法高效存储自定义 Python 对象,即使它们被插入到 Pandas DataFrames/NumPy 数组中。Pickled 数据无法进行索引或列切片,并且 updateappend 原语也无法在 Pickled 数据上工作。

ArcticDB 中的索引是如何工作的?

有关支持的索引类型的详细信息,请参阅入门页面。

我可以使用附加列进行 append 吗?/ 什么是动态 Schema?

对于启用了 Dynamic Schema 的库中的符号,您可以使用不同的列集进行 append(或 update)。更多信息请参阅 create_library 方法的文档。

您还可以更改数值列的类型 - 例如,读取时整数会被提升为浮点数。

ArcticDB 如何对数据进行分段?

有关更多详细信息,请参阅磁盘存储格式和关于 rows_per_segmentcolumns_per_segment 库配置选项的文档

ArcticDB 如何处理流式数据?

ArcticDB 对流式数据的支持已列入我们未来几个月的路线图

ArcticDB 如何处理并发写入?

由于没有中心化服务器,ArcticDB 不支持事务。相反,ArcticDB 支持跨符号的并发写入 - 但不针对单个符号(除非进行“分阶段写入”)。由写入者负责确保客户端不会并发修改同一个符号。

对于单个符号的并发写入,行为将是后写者优先(last-writer-wins)。数据本身不会丢失,但通过版本链只能访问后写者的版本。

重申一下,ArcticDB 支持对多个符号的并发写入,即使在同一个库中也是如此。

注意

ArcticDB 支持分阶段进行多次针对单个符号的并发写入。请参阅 staged 的文档。

ArcticDB 会在本地缓存任何数据吗?

是的,详情请参阅运行时配置页面。

如何启用详细日志记录?

详情请参阅运行时配置页面。

如何调整 ArcticDB 的性能?

详情请参阅运行时配置页面。

ArcticDB 支持分类数据吗?

ArcticDB 目前对分类数据的支持非常有限。可以向 writewrite_batch 方法提供包含分类列的 Series 和 DataFrames,并在 read 时按预期工作。然而,目前不支持对分类数据进行 appendupdate 操作,如果尝试会引发异常。使用 LazyDataFrameQueryBuilder 类进行过滤等分析操作也不支持分类数据,并且会引发异常或给出不正确的结果,具体取决于所请求的具体操作。

ArcticDB 如何处理 NaN

ArcticDB 中对 NaN 的处理取决于所考虑的列的类型:

  • 对于字符串列,完全支持 NaN 和 Python 的 None
  • 对于浮点数值列,也完全支持 NaN
  • 对于整数数值列,不支持 NaN。如果 ArcticDB 遇到 NaN,则原本只包含整数的列将被视为浮点列,此时,针对配置了或未配置动态 Schema 的库,类型提升的常规规则照常适用。