使用 DuckDB 访问 Hugging Face 上的 15 万+ 数据集

Hugging Face 和 DuckDB 团队
2024-05-29 · 6 分钟

简而言之:DuckDB 现在可以通过 hf:// 前缀从 Hugging Face 读取数据。

我们很高兴地宣布,我们在 DuckDB 中添加了对 hf:// 路径的支持,从而可以访问超过 150,000 个用于人工智能的数据集。我们与 Hugging Face 合作,普及用于训练和评估 AI 模型的数据集的访问、操作和探索。

数据集仓库

Hugging Face 是一个流行的中心平台,用户可以在这里存储、共享和协作处理机器学习模型、数据集和其他资源。

一个数据集通常包含以下内容

  • 一个 README 文件:这是一个纯文本文件,提供了仓库及其内容的概述。它通常描述目的、用法以及特定要求或依赖项。
  • 数据文件:根据仓库的类型,它可以包含数据文件,如 CSV、Parquet、JSONL 等。这些是仓库的核心组成部分。

一个典型的仓库看起来像这样

Hugging face repository

使用 hf:// 路径读取

在处理数据时,您通常需要读取各种格式的文件(例如 CSV、JSONL 和 Parquet)。从 v0.10.3 版本开始,DuckDB 通过 httpfs 扩展原生支持 hf:// 路径,从而可以轻松访问所有这些格式。

现在,可以使用以下 URL 模式查询它们

hf://datasets/⟨my_username⟩/⟨my_dataset⟩/⟨path_to_file⟩

例如,要读取 CSV 文件,可以使用以下查询

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-csv-1/data.csv';

其中

  • datasets-examples 是用户/组织的名称
  • doc-formats-csv-1 是数据集仓库的名称
  • data.csv 是仓库中的文件路径

查询结果是

种类 声音
宝可梦 皮卡
人类 你好

要读取 JSONL 文件,您可以运行

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-jsonl-1/data.jsonl';

最后,对于读取 Parquet 文件,请使用以下查询

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-parquet-1/data/train-00000-of-00001.parquet';

这些命令中的每一个都从指定的文件格式读取数据,并以结构化的表格格式显示它。根据您正在处理的文件格式选择适当的命令。

创建本地表

为了避免每次查询都访问远程端点,您可以通过运行 CREATE TABLE ... AS 命令将数据保存在 DuckDB 表中。例如

CREATE TABLE data AS
    SELECT *
    FROM 'hf://datasets/datasets-examples/doc-formats-csv-1/data.csv';

然后,只需按如下方式查询 data

SELECT *
FROM data;

多个文件

在处理大型数据集时,您可能需要同时查询多个文件。让我们看一个使用 cais/mmlu(衡量大规模多任务语言理解)数据集的快速示例。此数据集捕获了一个测试,该测试包含来自各个知识分支的多项选择题。它涵盖了 57 个任务,包括小学数学、美国历史、计算机科学、法律等。为了在此测试中获得高精度,AI 模型必须具备广泛的世界知识和解决问题的能力。

首先,让我们统计单个文件中的行数。要从 cais/mmlu 数据集中的单个文件中获取行数,请使用以下查询

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/dev-00000-of-00001.parquet';
计数
5

同样,对于同一数据集中的另一个文件(test-00000-of-00001.parquet),我们可以运行

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/test-00000-of-00001.parquet';
计数
152

要查询特定格式下的所有文件,您可以使用 glob 模式。以下是如何计算与模式 *.parquet 匹配的所有文件中的行数

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet';
计数
173

通过使用 glob 模式,您可以有效地处理大型数据集并跨多个文件执行全面查询,从而简化您的数据检查和处理任务。在这里,您可以看到如何查找天文学中包含单词“planet”的问题

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet'
WHERE question LIKE '%planet%';
计数
21

并查看一些示例

SELECT question
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet'
WHERE question LIKE '%planet%'
LIMIT 3;
问题
为什么小行星带所在的位置没有行星?
在太阳系的哪个行星上可以找到大红斑?
行星的岩石圈是由以下层组成

版本控制和修订

在 Hugging Face 仓库中,数据集版本或修订是不同的数据集更新。每个版本都是特定时间的快照,允许您跟踪更改和改进。在 git 术语中,它可以理解为一个分支或特定的提交。

您可以使用以下 URL 查询不同的数据集版本/修订

hf://datasets/my_username/my_dataset@my_branch/path_to_file

例如

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-csv-1@~parquet/**/*.parquet';
种类 声音
宝可梦 皮卡
人类 你好

之前的查询将读取 ~parquet 修订下的所有 parquet 文件。这是一个特殊的分支,Hugging Face 会自动生成每个数据集的 Parquet 文件,以实现高效扫描。

身份验证

在 DuckDB Secrets Manager 中配置您的 Hugging Face 令牌以访问私有或门控数据集。首先,访问 Hugging Face 设置 – 令牌以获取您的访问令牌。其次,使用 DuckDB 的 Secrets Manager在您的 DuckDB 会话中设置它。DuckDB 支持两个用于管理密钥的提供程序

  • CONFIG:用户必须将所有配置信息传递到 CREATE SECRET 语句中。要使用 CONFIG 提供程序创建密钥,请使用以下命令

    CREATE SECRET hf_token (
       TYPE huggingface,
       TOKEN 'your_hf_token'
    );
    
  • credential_chain:自动尝试获取凭据。对于 Hugging Face 令牌,它将尝试从 ~/.cache/huggingface/token 获取。要使用 credential_chain 提供程序创建密钥,请使用以下命令

    CREATE SECRET hf_token (
       TYPE huggingface,
       PROVIDER credential_chain
    );
    

结论

DuckDB 中 hf:// 路径的集成显着简化了对 Hugging Face 上超过 150,000 个数据集的访问和查询。此功能普及了数据操作和探索,使用户可以更轻松地与各种文件格式(如 CSV、JSON、JSONL 和 Parquet)进行交互。通过使用 hf:// 路径,用户可以执行复杂的查询,高效地处理大型数据集,并利用 Hugging Face 仓库的广泛资源。

该集成支持无缝访问单个文件、使用 glob 模式的多个文件以及不同的数据集版本。DuckDB 的强大功能确保了灵活且简化的数据处理体验。此集成是使 AI 数据集访问对研究人员和开发人员更易于访问和高效的重大飞跃,从而促进创新并加速机器学习的进步。

想了解更多关于利用 DuckDB 与 Hugging Face 数据集的信息?探索详细指南