【问题标题】:Fast SQL record look-up by using hash in Python/pandas在 Python/pandas 中使用哈希快速查询 SQL 记录
【发布时间】:2019-01-22 13:48:02
【问题描述】:

我希望维护一个从第三方收集数据的 (Postgres) SQL 数据库。由于大多数数据是静态的,虽然我每天都会得到完整的转储,但我只想存储新数据。即,每天我都会获得 100K 条新记录,比如 300 列,而 95K 行将是相同的。为了以一种有效的方式这样做,我正在考虑在数据旁边插入我的记录的哈希(来自 Pandas 数据帧或 Python 字典)。还存储了一些其他数据,例如将其加载到数据库中时。然后我可以在向数据库中插入数据之前,对传入的数据进行哈希处理并轻松验证该记录尚未在数据库中,而不必检查所有 300 列。

我的问题:选择哪个哈希函数(鉴于我在 Python 中并且更喜欢使用非常快速且可靠的解决方案,该解决方案只需要我这边的少量编码,同时能够处理各种数据,如整数、浮点数、字符串、日期时间等)

对于二和三,如果您推荐,我如何为任意 dicts 和 pandas 行实现它?我在保持这种简单性方面收效甚微。例如,对于字符串,我需要明确定义编码,并且记录中字段的顺序也不应该改变哈希。

编辑:我刚刚意识到,为此依赖 Python 可能会很棘手,如果我更改编程语言,我最终可能会得到不同的哈希值。将其绑定到数据库似乎是更明智的选择。

【问题讨论】:

    标签: python sql pandas hash


    【解决方案1】:

    你试过pandas.util.hash_pandas_object吗?

    不确定这有多有效,但也许你可以这样使用它:

    df.apply(lambda row: pd.util.hash_pandas_object(row), axis=1)

    这至少会为 df 中的每一行提供 pandas 系列的哈希值。

    【讨论】:

    • 它适用于 Pandas 数据帧(实际上,我需要按如下方式调用它:pd.util.hash_pandas_object(data),每行返回一个哈希),但不幸的是不适用于字典或字典列表。此外,列顺序也很重要,但从数据的角度来看,它不应该如此。我想得越多,我就越倾向于数据库解决方案。
    • 澄清一下,我的想法是使用上面的df.apply 示例在数据库中创建一个列,该列是每一行的哈希值。然后当有新数据时,将其加载到临时数据帧中,并使用相同的函数将行哈希与现有行哈希进行比较。
    • 这确实可行,尽管它强制依赖 Pandas。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2020-05-20
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多