使用 Python 和 Clickhouse 采样进行大型数据集可视化分析


使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

Visual data analysis with Python and Clickhouse sampling

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

当您使用 Clickhouse 时,通常意味着使用(至少)数十亿个数据点。同时 Python 数据分析工具(包括 Matplotlib)通常使用内存数据集。为了从 2 个世界中获得最佳效果,我们可以使用强大的 Clickhouse 采样 功能,让我们看看如何做到这一点。

Clickhouse 数据集

我们有一个包含 2 列和 10 亿行的示例表:

 CREATE TABLE default.data (`x` UInt32, `y` UInt32)  
 ENGINE = MergeTree ORDER BY cityHash64(x) SAMPLE BY cityHash64(x)

如您所见,我们有 启用采样 因为我们需要它来做基于 Python 和 Matplotlib 的可视化分析。

自从我们的桌子在[ 7.5G](https://onelinerhub.com/clickhouse/get-table-size) 在尺寸方面 ,无法放入我们的机器RAM,我们将根据采样数据进行分析。让我们根据 Matplotlib 中流行的数据分析图表来探索一下。

散点图

该图表允许查看两个值集(表列)之间是否存在任何可见的线性相关性。我们正好有 2 列要分析,所以让我们从这张图表开始。

采样数据

由于我们有太多的数据点( 1b 表中的行)以适合单个图表,让我们对数据进行采样:

在这里,我们要求 Clickhouse 只使用 0.0001% 的数据将产生几乎 1000 要点:

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

在这里我们可以看到,我们的 是的 列具有可见的线性依赖于 X 柱子。我们只使用了一小部分数据来找出答案。

非抽样数据

为什么我们关心采样呢?即使我们有无限的内存,太多的数据也会花费太多的时间来处理和可视化。例如,让我们在 0.1% 数据样本(即 1000 比我们使用的初始样本大几倍):

 ...  
 rows = client.execute('SELECT x,y FROM data **样品 0.001** ')  
 ...

首先,我们不得不等待 21 秒得到结果:

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

图表——只是我们初始正确采样图表的一个非常“抗锯齿”版本:

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

这甚至不接近未采样的数据集。我只是没有那么强大的机器来处理完整的数据集,但很明显, 需要几个小时 在没有任何好处的情况下完成。

良好的采样

因此,抽样为我们节省了时间,并且仍然可以对我们的数据性质做出有价值的结论。

如何选择合适的样本量?这取决于我们要探索的图表。散点图是一团点云,所以有成百上千个点的东西很酷。

样本太少可能会产生误导或毫无意义。例如 从数据中选择 x,y **样品 0.00000001** 会给我们:

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

这在视觉分析方面没有价值。

直方图

与散点图不同,直方图允许我们估计单个值集(单个表列)内的值分布。让我们为我们的构建直方图 是的 柱子:

在这里,我们使用了 0.001% 建立直方图的样本:

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

我们可以看到,这个数量 是的 列值大于 2*10^8 正在下降。就本专栏的性质而言,这可能是有价值的见解。同时, X 列均匀分布:

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

直方图的样本量应该大​​于散点图的样本量,因为我们计算了有限数量的 bin 内的条目数。数万行的样本应该没问题,但如果需要可以更大。

箱形图

这张图表, 在这里解释 ,可以快速显示一个值集(单表列)的主要分布特征:

让我们为我们的两列构建箱线图:

使用 Python 和 Clickhouse 采样进行大型数据集可视化分析

再次,我们可以看到 是的 列值倾向于较小的值(指向底部)。这里的样本大小规则与直方图相同,样本中的数万行或更大的行很酷。

概括

利用 Clickhouse 采样 对于大表使用 Python 可视化分析工具,例如 Matplotlib:

 从 clickhouse_driver 导入客户端  
 客户端=客户端(主机='本地主机')  
 rows = client.execute('SELECT x,y FROM data **样品 0.00001** ') x = []  
 对于行中的行:  
 x.append(行[0]) 将 matplotlib.pyplot 导入为 plt  
 plt.hist(x, bins=100)  
 plt.show()

这将节省您的时间并允许使用“超出 RAM”大小的数据集。调整不同图表的样本大小,以确保获得可靠的结果。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/23548/25231001

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288545.html

(0)
上一篇 2022年9月10日
下一篇 2022年9月10日

相关推荐

发表回复

登录后才能评论