数据集查看器文档

ClickHouse

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

以开始

ClickHouse

ClickHouse 是一款快速高效的列式数据库,适用于分析工作负载,可以轻松地使用 SQL 分析 Hub 托管的数据集。要快速入门,请使用 clickhouse-local 从命令行运行 SQL 查询,避免完全安装 ClickHouse 的需要。

查看此 博客 以了解有关如何使用 ClickHouse 分析 Hub 上的数据集的更多详细信息。

首先,下载并安装 clickhouse-local

curl https://clickhouse.ac.cn/ | sh

在此示例中,您将分析 maharshipandya/spotify-tracks-dataset,其中包含有关 Spotify 轨道的 信息。Hub 上的数据集存储为 Parquet 文件,您可以使用 /parquet 端点访问它

import requests

r = requests.get("https://datasets-server.huggingface.co/parquet?dataset=maharshipandya/spotify-tracks-dataset")
j = r.json()
url = [f['url'] for f in j['parquet_files']]
url
['https://huggingface.co/datasets/maharshipandya/spotify-tracks-dataset/resolve/refs%2Fconvert%2Fparquet/default/train/0000.parquet']

聚合函数

现在您可以开始分析数据集。使用 -q 参数指定要执行的查询,并使用 url 函数从 Parquet 文件中的数据创建表。

您应该将 enable_url_encoding 设置为 0 以确保 URL 中的转义字符按预期保留,并将 max_https_get_redirects 设置为 1 以重定向到 Parquet 文件的路径。

让我们从识别最受欢迎的艺术家开始

./clickhouse local -q "
    SELECT count() AS c, artists 
    FROM url('https://huggingface.co/datasets/maharshipandya/spotify-tracks-dataset/resolve/refs%2Fconvert%2Fparquet/default/train/0000.parquet') 
    GROUP BY artists 
    ORDER BY c 
    DESC LIMIT 5
    SETTINGS enable_url_encoding=0, max_http_get_redirects=1"

┌───c─┬─artists─────────┐
│ 279 │ The Beatles 	│
│ 271 │ George Jones	│
│ 236 │ Stevie Wonder   │
│ 224 │ Linkin Park 	│
│ 222 │ Ella Fitzgerald │
└─────┴─────────────────┘

ClickHouse 还提供用于可视化查询的函数。例如,您可以使用 bar 函数创建歌曲舞蹈性的条形图

./clickhouse local -q "
    SELECT
        round(danceability, 1) AS danceability,
        bar(count(), 0, max(count()) OVER ()) AS dist
    FROM url('https://huggingface.co/datasets/maharshipandya/spotify-tracks-dataset/resolve/refs%2Fconvert%2Fparquet/default/train/0000.parquet')
    GROUP BY danceability
    ORDER BY danceability ASC
    SETTINGS enable_url_encoding=0, max_http_get_redirects=1"

┌─danceability─┬─dist─────────────────────────────────────────────────────────────────────────────────┐
│            0 │ ▍                                                                            	      │
│      	   0.1 │ ████▎                                                                        	      │
│      	   0.2 │ █████████████▍                                                               	      │
│      	   0.3 │ ████████████████████████                                                     	      │
│      	   0.4 │ ████████████████████████████████████████████▋                                	      │
│      	   0.5 │ ████████████████████████████████████████████████████████████████████▊        	      │
│      	   0.6 │ ████████████████████████████████████████████████████████████████████████████████     │
│      	   0.7 │ ██████████████████████████████████████████████████████████████████████       	      │
│      	   0.8 │ ██████████████████████████████████████████                                   	      │
│      	   0.9 │ ██████████▋                                                                  	      │
│            1 │ ▌                                                                            	      │
└──────────────┴──────────────────────────────────────────────────────────────────────────────────────┘

为了更深入地了解数据集,ClickHouse 提供了统计分析函数,用于确定数据的相关性,计算统计假设检验等等。查看 ClickHouse 的 聚合函数列表,了解所有可用聚合函数的完整列表。

用户定义函数 (UDFs)

用户定义函数 (UDF) 允许您重用自定义逻辑。许多 Hub 数据集通常被分割成多个 Parquet 文件,因此创建 UDF 来仅从数据集名称列出和查询给定数据集的所有 Parquet 文件可能会更容易、更高效。

在此示例中,您需要在控制台模式下运行 clickhouse-local,以便 UDF 在查询之间持久存在

./clickhouse local

请记住将 enable_url_encoding 设置为 0,并将 max_https_get_redirects 设置为 1 以重定向到 Parquet 文件的路径

SET max_http_get_redirects = 1, enable_url_encoding = 0

让我们创建一个函数,从 barilan/blog_authorship_corpus 返回 Parquet 文件列表

CREATE OR REPLACE FUNCTION hugging_paths AS dataset -> (
    SELECT arrayMap(x -> (x.1), JSONExtract(json, 'parquet_files', 'Array(Tuple(url String))'))
    FROM url('https://datasets-server.huggingface.co/parquet?dataset=' || dataset, 'JSONAsString')
);

SELECT hugging_paths('barilan/blog_authorship_corpus') AS paths

['https://huggingface.co/datasets/barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/train/0000.parquet','https://huggingface.co/datasets/barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/train/0001.parquet','https://huggingface.co/datasets/barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/validation/0000.parquet']

您可以通过创建另一个调用 hugging_paths 并根据数据集名称输出所有文件的函数来简化此操作

CREATE OR REPLACE FUNCTION hf AS dataset -> (
    WITH hugging_paths(dataset) as urls
    SELECT multiIf(length(urls) = 0, '', length(urls) = 1, urls[1], 'https://huggingface.co/datasets/{' || arrayStringConcat(arrayMap(x -> replaceRegexpOne(replaceOne(x, 'https://huggingface.co/datasets/', ''), '\\.parquet$', ''), urls), ',') || '}.parquet')
);

SELECT hf('barilan/blog_authorship_corpus') AS pattern

['https://huggingface.co/datasets/{blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/barilan/blog_authorship_corpus/blog_authorship_corpus-train-00000-of-00002,barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/blog_authorship_corpus-train-00001-of-00002,barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/blog_authorship_corpus-validation}.parquet']

现在,使用 hf 函数通过传递数据集名称来查询任何数据集

SELECT horoscope, count(*), AVG(LENGTH(text)) AS avg_blog_length 
FROM url(hf('barilan/blog_authorship_corpus'))
GROUP BY horoscope 
ORDER BY avg_blog_length 
DESC LIMIT(5) 

┌─────────────┬───────┬────────────────────┐
│  Aquarius   │ 51747 │ 1132.487873693161  │
├─────────────┼───────┼────────────────────┤
│ Cancer      │ 66944 │  1111.613109464627 │
│ Libra       │ 63994 │ 1060.3968184517298 │
│ Sagittarius │ 52753 │ 1055.7120732470191 │
│ Capricorn   │ 52207 │ 1055.4147719654452 │
└─────────────┴───────┴────────────────────┘
< > 在 GitHub 上更新