【发布时间】:2018-03-21 16:19:27
【问题描述】:
我正在使用 MySQL(结合 Java)中的大型数据集并尝试实现频繁项集算法。 该算法的一个反复出现的方面是计算一组项目(一个项目是一个随机整数)在数据集中出现的次数。
以这个小数据集为例T:
ID | COL1 | COL2 | COL3 | COL4 | COL5 |
---------------------------------------
1 | 8 | 35 | 42 | 12 | 27 |
2 | 22 | 42 | 35 | 8 | NULL |
3 | 18 | 22 | 8 | NULL | NULL |
4 | 42 | 12 | 27 | 35 | 8 |
5 | 18 | 27 | 12 | 22 | NULL |
还有这张表T2:
COL1 | COL2 |
-------------
35 | 27 |
22 | 8 |
42 | 8 |
18 | 35 |
35 | 42 |
我想要的结果是下表(它也可以是查询的答案):
COL1 | COL2 | COUNT |
---------------------
35 | 27 | 2 |
22 | 8 | 2 |
42 | 8 | 3 |
18 | 35 | 0 |
35 | 42 | 3 |
所以我想计算表 T 中表 T2 每一行的每次出现次数。基本上一行T2是T
行子集的次数这必须在每一代算法中完成。这是一个非常小的例子,最终必须对 T3(3 个项目的行)、T4(4 个项目的行)等进行同样的操作。表 T 保持不变。 我还必须考虑到顺序无关紧要 (|35, 27| = |27, 35|) 并且它们可能不会在 T
是否可以在不遍历数据集太多次的情况下执行此操作(而 太多 = 超过 T2 中的行数)? 将一行表示为一个元组(例如 (35, 27))会更好吗?
【问题讨论】:
-
“而太多 = 超过 T2 的行数”看起来不像我能想到的是生成一个 cvs 并使用 FIND_IN_SET 找到它们,但你不能使用索引如果 anny 所以这不会在大型数据集上扩展或在 T 表上使用 UNION ALL 将列转换为记录并与 T2 表外的列连接,但如果列 col1 和 col2 都被索引,则只会在大型数据集上扩展这种方法的问题是 UNION ALL 将使用内存表来保存结果。
-
将行表示为元组只会使您的问题更加复杂;问题是 T 应该是两个表
T(带有 set_id)和T values(带有 set_id、值,如果重要的话,可能还有“序列”。)... T2-T4 应该进行类似的重组。跨度>
标签: mysql subset find-occurrences