假设我的表格是这样的:
+---------------------+
|ColA | ColB | ColC |
+---------------------+
| AA C 5 |
| AA C 8 |
| AA C 9 |
| BB D 3 |
| BB D 4 |
| CC E 1 |
| CC E 2 |
| CC E 3 |
| CC E 5 |
+---------------------+
我想从cola随机抽样组,而不是行。每一组是一个事件序列,我想要所有这些事件为每一组,所以这就是为什么我不想只是采样行。我想做如下示例:
+---------------------+
ColA | ColB | ColC
+---------------------+
| AA C 5 |
| AA C 8 |
| AA C 9 |
| CC E 1 |
| CC E 2 |
| CC E 3 |
| CC E 5 |
+---------------------+
下面显然是采样行,所以它不是很好。
SELECT * FROM TABLE TABLE_SAMPLE BERNOULI(1)
GROUP BY COLUMN A
我也有一个包含10个组的colb,我希望所有这些组的总行数相等。谢谢你!
在Presto/Trino中没有这样做的直接方法。不过,您可以采用几种方法。
如果您想要确定性抽样,您可以通过应用统一哈希函数并选择组的百分比将组转换为数字。例如:
SELECT *
FROM t
WHERE bitwise_and(from_big_endian_64(xxhash64(cast(a as varbinary))), 1023) <= 0.5 * 1023
- 计算具有
xxhash64
:xxhash64(cast(a as varbinary))
的分组列的哈希值。生成64位二进制值。 - 使用
from_big_endian_64
将二进制值转换为数字,并使用bitwise_and(x, 1023)
从中取出10位。生成一个介于0和1023之间的数字。 - 在
1%
取样,选择任意组,使上述值小于0.01 * 1023。
如果要对组进行非确定性随机抽样,可以先对组进行抽样,然后选择与这些组相匹配的行:
WITH
groups AS (SELECT DISTINCT colA FROM t),
sampled_groups AS (SELECT * FROM groups TABLESAMPLE BERNOULLI(1)),
SELECT *
FROM t
WHERE colA IN (TABLE sampled_groups)