写在前面
上次是Hugging Face主动拥抱DuckDB,50多万种数据集轻松查
这次是DuckDB 主动拥抱Hugging Face,总算完成了互相拥抱。但DuckDB这次忘记了拥抱中国用户,我来帮DuckDB一把。
原文:Access 150k+ Datasets from Hugging Face with DuckDB[1]
author: Hugging Face 和 DuckDB 团队

2024年5月底,DuckDB激动地宣布,DuckDB 现已支持 hf://
路径,让您可以轻松访问 Hugging Face 平台上超过 15 万个用于人工智能研究的数据集。DuckDB与 Hugging Face 携手合作,致力于让访问、处理和探索 AI 模型训练和评估所需的数据集变得更加便捷高效。但是,他们忘记了可怜的中国兄弟,总不能每次使用魔法来访问吧?好在我们有Hugging Face镜像可以使用, 我之前也多次介绍过,比如 ,
今天的解决办法依然离不开它, 可惜DuckDB不支持读取改环境变量HF_ENDPOINT
,所以得从源代码入手了,下面把修改后的源代码附上:替换掉 hff.hpp
中的
struct ParsedHFUrl{
//! Path within the
string path;
//! Name of the repo (i presume)
string repository;
//! Endpoint, defaults to HF
string endpoint ="https://huggingface.co";
//! Which revision/branch/tag to use
string revision ="main";
//! For DuckDB this may be a sensible default?
string repo_type ="datasets";
};
为
struct ParsedHFUrl{
//! Path within the
std::string path;
//! Name of the repo (i presume)
std::string repository;
//! Endpoint, defaults to HF
std::string endpoint;
//! Which revision/branch/tag to use
std::string revision;
//! For DuckDB this may be a sensible default?
std::string repo_type;
// Constructor
ParsedHFUrl():
endpoint(std::getenv("HF_ENDPOINT")? std::getenv("HF_ENDPOINT"):"https://huggingface.co"),
revision("main"),
repo_type("datasets"){}
};
即可。
顺便说了,有了GPT真好,我把想法提出来,GPT帮我完成代码工作,我没有修改一个字符。
接下来就是编译了
BUILD_HTTPFS=1 make
HF_ENDPOINT=https://hf-mirror.com ./build/release/duckdb
v0.5.2-dev26246 7b2cdc786b
Enter".help"for usage hints.
Connected to a transient in-memory database.
Use".open FILENAME" to reopen on a persistent database.
D SET autoinstall_known_extensions=1;
D SET autoload_known_extensions=1;
D SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/test-00000-of-00001.parquet';
┌───────┐
│ count │
│ int64 │
├───────┤
│152│
└───────┘
D .q
附上测试效果:

下面让我们看看DuckDB 如何轻松访问 Hugging Face 海量数据集吧
数据集仓库
Hugging Face (https://huggingface.co/) 是一个广受欢迎的平台,用户可以在此存储、共享机器学习模型、数据集以及其他资源,并进行协同开发。
数据集通常包含以下内容:
•
README
文件:这是一个纯文本文件,概述了数据集仓库及其内容,通常会描述数据集的用途、使用方法以及特定的要求或依赖项。• 数据文件:根据数据集类型的不同,数据文件格式可能会有所不同,例如 CSV、Parquet、JSONL 等。这些文件构成了数据集的核心内容。
一个典型的数据集仓库结构如下所示:

使用 hf:// 路径读取数据
在处理数据时,您经常需要读取各种格式的文件,例如 CSV、JSONL 和 Parquet。自 v0.10.3 版本开始,DuckDB 原生支持 hf://
路径,作为 httpfs
扩展[2] 的一部分,使您能够轻松访问所有这些格式的数据。
现在,您可以使用以下 URL 模式查询 Hugging Face 数据集:
hf://datasets/⟨用户名⟩/⟨数据集名称⟩/⟨文件路径⟩
例如,要读取 CSV 文件,可以使用以下查询语句:
SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-csv-1/data.csv';
其中:
•
datasets-examples
是用户名或组织名称•
doc-formats-csv-1
是数据集仓库的名称•
data.csv
是仓库中的文件路径
查询结果如下所示:
| kind | sound |
| dog | woof |
| cat | meow |
| pokemon | pika |
| human | hello |
要读取 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';
创建本地表后,您可以直接查询该表:
SELECT *
FROM data;
处理多个文件
在处理大型数据集时,您可能需要同时查询多个文件。让我们以 cais/mmlu[3](测量大规模多任务语言理解)数据集为例来说明如何使用 DuckDB 高效地查询多个文件。该数据集包含来自各个知识领域的包含多项选择题的测试,涵盖 57 个任务,包括初等数学、美国历史、计算机科学、法律等等。为了在本次测试中获得高准确率,AI 模型必须具备广泛的世界知识和解决问题的能力。
首先,让我们计算单个文件中的行数。要从 cais/mmlu 数据集中的单个文件获取行数,请使用以下查询语句:
SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/dev-00000-of-00001.parquet';
| count |
| 5 |
类似地,对于同一数据集中的另一个文件 (test-00000-of-00001.parquet
),我们可以运行以下查询:
SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/test-00000-of-00001.parquet';
| count |
| 152 |
要查询特定格式下的所有文件,可以使用 glob 模式[4]。例如,以下查询可以统计所有 Parquet 文件中的总行数:
SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet';
| count |
| 173 |
通过使用 glob 模式,您可以高效地处理大型数据集,并跨多个文件执行查询,从而简化数据检查和处理任务。例如,您可以使用以下查询查找天文学类别中包含单词“planet”的所有问题:
SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet'
WHERE question LIKE '%planet%';
| count |
| 21 |
以下查询展示了其中三个示例:
SELECT question
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet'
WHERE question LIKE '%planet%'
LIMIT 3;
| question |
| Why isn't there a planet where the asteroid belt is located? |
| On which planet in our solar system can you find the Great Red Spot? |
| The lithosphere of a planet is the layer that consists of |
版本控制和修订
在 Hugging Face 数据集仓库中,数据集版本或修订指的是数据集的不同更新。每个版本都是特定时间点的快照,方便用户跟踪数据集的变化和改进。用 Git 术语来说,它可以理解为分支或特定提交。
您可以使用以下 URL 模式查询不同版本或修订的数据集:
hf://datasets/⟨用户名⟩/⟨数据集名称⟩@⟨分支名称⟩/⟨文件路径⟩
例如:
SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-csv-1@~parquet/**/*.parquet';
| kind | sound |
| dog | woof |
| cat | meow |
| pokemon | pika |
| human | hello |
上述查询将会读取 ~parquet
修订版本下的所有 Parquet 文件。~parquet
是一个特殊分支,Hugging Face 会自动将每个数据集转换为 Parquet 格式并存储在该分支下,以便用户进行高效的数据扫描。
身份验证
要访问私有或受控数据集,您需要在 DuckDB Secrets Manager 中配置您的 Hugging Face Token。首先,请访问 Hugging Face 设置 - Token[5] 页面获取您的访问 Token。然后,使用 DuckDB 的 Secrets Manager[6] 在您的 DuckDB 会话中设置 Token。DuckDB 支持两种 Token 管理方式:
•
CONFIG
:您需要将所有配置信息传递给CREATE SECRET
语句。要使用CONFIG
方式创建密钥,请使用以下命令:CREATE SECRET hf_token (
TYPE HUGGINGFACE,
TOKEN 'your_hf_token'
);•
CREDENTIAL_CHAIN
:DuckDB 会自动尝试获取凭据。对于 Hugging Face Token,它会尝试从~/.cache/huggingface/token
文件中读取。要使用CREDENTIAL_CHAIN
方式创建密钥,请使用以下命令:CREATE SECRET hf_token (
TYPE HUGGINGFACE,
PROVIDER CREDENTIAL_CHAIN
);
结论
DuckDB 中 hf://
路径的集成极大简化了对 Hugging Face 平台上超过 15 万个数据集的访问和查询流程。该功能使数据操作和探索变得更加便捷高效,让更多用户能够轻松访问和利用 CSV、JSON、JSONL 和 Parquet 等各种格式的数据集。通过利用 hf://
路径,用户可以执行复杂查询、高效处理大型数据集并利用 Hugging Face 数据集仓库的丰富资源。
DuckDB 与 Hugging Face 的集成支持无缝访问单个文件、使用 glob 模式查询多个文件以及访问不同版本的数据集。DuckDB 强大的功能为用户提供了灵活且高效的数据处理体验。这种集成是朝着让 AI 数据集访问更加便捷高效迈出的重要一步,必将促进机器学习领域的创新和发展。
想了解更多关于如何使用 DuckDB 处理 Hugging Face 数据集的信息,请访问 详细指南[7]。
引用链接
[1]
Access 150k+ Datasets from Hugging Face with DuckDB: https://duckdb.org/2024/05/29/access-150k-plus-datasets-from-hugging-face-with-duckdb.html[2]
httpfs
扩展: https://duckdb.org/docs/extensions/httpfs/overview.html[3]
cais/mmlu: https://huggingface.co/datasets/cais/mmlu[4]
glob 模式: https://duckdb.org/docs/data/multiple_files/overview.html#multi-file-reads-and-globs[5]
Hugging Face 设置 - Token: https://huggingface.co/settings/tokens[6]
Secrets Manager: https://duckdb.org/docs/configuration/secrets_manager.html[7]
详细指南: https://huggingface.co/docs/hub/datasets-duckdb




