【问题标题】:Is there a fast way to query distinct column values in a huge hdf5 table with pytables?有没有一种快速的方法可以使用 pytables 在巨大的 hdf5 表中查询不同的列值?
【发布时间】: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() 与 numpy array.unique() 结合使用,以获得您需要的内容。下面的答案中的简短示例。

标签: hdf5 pytables


【解决方案1】:

这显示了如何从 Pytables 表中提取一列数据到一个 Numpy 数组,然后使用 Numpy np.unique() 方法获取一个新的唯一值数组。还显示了获取唯一值数组和每个值的计数的选项。

mytable = h5_file.root.YOUR_DATASET

Col1_array = mytable.col('Col1')
# above statement is equivalent to:
Col1_array = mytable.read(field='Col1')

# get array of unique values:
uarray = np.unique(Col1_array)

# if you also want an array of counts for each unique value:
uarray, carray = np.unique(Col1_array, return_counts=True)

【讨论】:

  • 这可以得到结果,但它似乎并不比遍历整个表并使用 defaultdict 构建唯一列表快。这一观察来自使用包含 2.2 亿条记录的小型表测试这两种方法。我认为 pytables 会有一些花哨的东西并且没有很好的记录。 Build dict time = 318.5 seconds, size = 4522 Get sym_array time = 212.0 seconds Get unique time = 87.4 seconds Count uniques = 4522 表行数:221264142
  • 我不使用关系数据库,所以不能添加更多。 SourceForge 上讨论了一种有趣的方法:PyTables - Hierarchical datasets HDF5 不是 RDB,而且我不知道 Pytables 中的“类似 SQL”的功能。也许 HDFql 可以提供帮助?在此处查看信息:HDFql 祝你好运。
  • 谢谢,这些链接很有帮助。我怀疑 HDFql 可以加快速度,但看起来我可以用它来构建我需要的 hdf5 COM 插件。 SourceForge 链接看起来很有希望,但我尝试了那里给出的两种“快速”方法,它们所用的时间大致与你的方法和我的方法一样长。我将关闭这个回答,“不,没有快速的方法。”
  • 这里只是一般性评论...numpy.unique 将对您的结果进行排序!这可能非常耗时...尝试使用pandas.unique,根据定义,这会使您的值未排序,并且可能会为非常大的数组提供相当多的加速
猜你喜欢
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 2016-11-26
  • 2013-05-15
  • 1970-01-01
  • 2021-12-13
  • 2019-10-18
  • 1970-01-01
相关资源
最近更新 更多