【发布时间】:2019-06-04 00:07:49
【问题描述】:
我有一个巨大的 hdf5 文件,它由一个表、26 列、大约 30 亿行组成(不可能放入内存中)。我做了很多谷歌搜索,但找不到快速查询一列或一组列的不同值的方法。有没有比遍历所有行和构建列表更快的方法?
【问题讨论】:
-
dts,这就是 pytables 在“内核搜索”方面的亮点。首先,他们说具有高达 100 亿行的出色性能。 :-) 而且,各种
.where()方法完全符合您的要求。.where()返回一个行迭代器,但您也可以使用.get_where_list()返回一个坐标(行)列表,或者使用.read_where()返回一个 np 数组。在他们的文档中清楚地解释了:Pytables table.where -
是的,我阅读并重新阅读了该文档,并且正在对此数据集进行一些“位置”查询,但我不知道如何将与 SQL SELECT DISTINCT 查询等效的东西拼凑在一起。 .. 谷歌搜索这个问题似乎只是显示了一堆奇怪的东西,这些东西并不直接适用于有我问题的人。还有什么提示吗?
-
我不懂 SQL,所以不知道什么是 SELECT DISTINCT 查询。查看条件参数。它引用字段/列名称。在不了解您的数据细节的情况下,很难提供更多细节。 'Field_name == value" 将返回与该值匹配的所有行。您可以使用布尔值来构建更复杂的查询。
-
无需了解数据,这是一项非常笼统的任务……我的表有 30 亿行。列“Col1”在 30 亿行中仅采用 1000 个不同的值。我需要得到这 1000 个不同值的列表。对于任何关系数据库来说,这都是简单、快速和基本的,但我的理解(可能有缺陷)是 hdf5 很麻烦。
-
您可以将 pytables
table.col()或table.read()与 numpyarray.unique()结合使用,以获得您需要的内容。下面的答案中的简短示例。