DuckDB:在 Hugging Face Hub 上对 50,000 多个数据集运行 SQL 查询
Hugging Face Hub 致力于向所有人提供数据集的开放访问权限,并为用户提供探索和理解数据集的工具。您可以在其中找到许多用于训练流行的大型语言模型 (LLM) 的数据集,例如 Falcon、Dolly、MPT 和 StarCoder。此外,还有用于解决数据集中公平性和偏差问题的工具,例如 Disaggregators,以及用于预览数据集中示例的工具,例如数据集查看器。

我们很高兴地宣布,我们最近增加了另一项功能,帮助您分析 Hub 上的数据集;您可以使用 DuckDB 对 Hub 上存储的任何数据集运行 SQL 查询!根据 2022 年 StackOverflow 开发者调查,SQL 是第三大最受欢迎的编程语言。我们还需要一个快速的数据库管理系统 (DBMS),专门用于运行分析查询,这就是我们很高兴能与 DuckDB 集成的原因。我们希望这能让更多的用户访问和分析 Hub 上的数据集!
TLDR
数据集查看器自动将 Hub 上的所有公共数据集转换为 Parquet 文件,您可以通过单击数据集页面顶部的“自动转换为 Parquet”按钮来查看。您还可以通过简单的 HTTP 调用访问 Parquet 文件 URL 列表。
r = requests.get("https://datasets-server.huggingface.co/parquet?dataset=blog_authorship_corpus")
j = r.json()
urls = [f['url'] for f in j['parquet_files'] if f['split'] == 'train']
urls
['https://huggingface.co/datasets/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/blog_authorship_corpus-train-00000-of-00002.parquet',
'https://huggingface.co/datasets/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/blog_authorship_corpus-train-00001-of-00002.parquet']
创建与 DuckDB 的连接,并安装和加载 httpfs
扩展,以允许读取和写入远程文件
import duckdb
url = "https://huggingface.co/datasets/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/blog_authorship_corpus-train-00000-of-00002.parquet"
con = duckdb.connect()
con.execute("INSTALL httpfs;")
con.execute("LOAD httpfs;")
连接后,您就可以开始编写 SQL 查询了!
con.sql(f"""SELECT horoscope,
count(*),
AVG(LENGTH(text)) AS avg_blog_length
FROM '{url}'
GROUP BY horoscope
ORDER BY avg_blog_length
DESC LIMIT(5)"""
)
要了解更多信息,请查阅文档。
从数据集到 Parquet
Parquet 文件是列式存储的,这使得它们在存储、加载和分析方面更有效率。这在处理大型数据集时尤为重要,而在 LLM 时代,我们看到的大型数据集越来越多。为了支持这一点,数据集查看器会自动将 Hub 上的任何公共数据集转换为 Parquet 文件并发布。Parquet 文件的 URL 可以通过 /parquet
端点检索。
使用 DuckDB 进行分析
DuckDB 在运行复杂分析查询方面提供了令人印象深刻的性能。它能够直接在远程 Parquet 文件上执行 SQL 查询,而无需任何开销。借助 httpfs
扩展,DuckDB 能够使用 /parquet
端点提供的 URL 查询 Hub 上存储的远程文件(例如数据集)。DuckDB 还支持查询多个 Parquet 文件,这非常方便,因为数据集查看器会将大型数据集分片成更小的 500MB 块。
展望未来
了解数据集的内容对于模型开发非常重要,因为它会以各种方式影响模型质量!通过允许用户在 Hub 数据集上编写和执行任何 SQL 查询,这是我们实现数据集开放访问并帮助用户更了解数据集内容的另一种方式。我们很高兴您能尝试一下,并期待您的分析能揭示出什么样的见解!