【问题标题】:Repeatable random sampling SQL可重复随机抽样 SQL
【发布时间】:2011-02-01 07:00:59
【问题描述】:

我需要审查我的解决方案,以便从存储在 MPP 机器(当前为 Netezza,稍后可能是 hadoop/等)上的表中采样 100 个随机行

我对使用 Netezza 的 rand() 不感兴趣,因为我希望以后能够重现相同的样本,而且我不指望 setseed()。

我现在使用的解决方案是:

SELECT * FROM MY_TABLE ORDER BY ID % 371, ID % 17, ID % 501, ID LIMIT 100

这 3 个数字是我自己的 RNG 生成的素数。 我在正确的轨道上吗? 这个“随机”样本足够随机吗?

注意:我不需要它是一个加密的强随机样本,我只是想确保我每次都选择不同的样本,并且采样均匀,并且我希望能够轻松地重现我的如果需要,示例(通过执行相同的 SQL)。

谢谢!

【问题讨论】:

    标签: sql algorithm random data-mining netezza


    【解决方案1】:

    我不会尝试在 SQL 中生成随机数,因为很容易获得一些真正的随机数,将它们粘贴到表或存储过程中。

    转到https://www.fourmilab.ch/hotbits/secure_generate.html 以获取 256 个十六进制随机位,一次将 4 个数字分组,转换为十进制整数,然后使用前 100 个数字作为密钥。

    您将拥有一个可重复的序列,并且您可以根据需要制作任意数量的真正随机序列。

    如果您需要具有均匀分布的可重复伪随机数,同样的原则也适用。只需使用不同的数字来源即可。例如,您可以编写一个 Python 脚本,使用包含的 random 模块来生成您的数字。

    至于要使用的 SQL,如果您正确地构建数据库,它就很简单。在这种情况下,由于我构建了一次随机表,并多次将其用于查询,因此我将构建表以包含主键,而不仅仅是生成的随机数。或者,如果我要使用不同的数字集重复此操作,那么我将构建一个关系表(如在 ER 建模中),将随机数表链接到我正在采样的表。我不会将所有内容都强制写入 SQL,而是使用脚本语言生成随机数表并构建关系表。

    在您上面给出的示例中,您需要 100 个样本,因此随机抽样表将包含由外部脚本选择的 100 个主键。每次运行采样时,您都会获得完全相同的记录,直到您更改随机采样表。要更改表,请转储要采样的表的主键,然后运行脚本以随机选择 100,方法是生成 100 个介于 1 和主键总数之间的数字。如果你使用 Python 之类的工具,你可以获得均匀随机数、伽马分布、高斯分布、对数正态分布、帕累托等。

    【讨论】:

    • 你能说得更清楚些吗?假设我有这张真正随机数的表。如何在统一分发中使用它示例 my 表?我要随机加入我的桌子吗?
    • Dillon - 我仍然无法做到的事情:假设我想运行我的系统 10 次,然后能够重现每一次执行。在您建议的方法中,我必须保留 10 个随机数表或 10 个关系表,每个表都有数百万行长。在系统中,我建议您只记录 10 个 SQL 语句,每个语句都有自己的 3 个随机素数,并且复制只是运行正确的 SQL。这不是您描述的方法的主要缺点吗? (感谢您的耐心等待)
    • 我已经编辑了答案,希望现在可以清楚地解释它,以便您了解构建随机抽样表并使用它进行可重复抽样是多么简单。
    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2019-02-20
    • 2021-09-27
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多