具有多个值的网络流的维度模型

Posted

技术标签:

【中文标题】具有多个值的网络流的维度模型【英文标题】:Dimensional model for web stream with multiple values 【发布时间】:2012-11-15 18:51:02 【问题描述】:

寻求一点帮助来阐明维度模型。我正在研究归结为 Web 事件分析的内容 - 给定 Web 日志,我想解析和存储 URL 中存在的变量。诀窍是这些变量并不总是预定义的,有时,一个变量可能包含多个值。

让我们看一个假设。如果我有一个像

这样的查询字符串

session_id=SID&key1=value1&key2=value2&key3=value3a&key3=value3b&key3=value3c

我的目标是能够通过这些键的任意组合来计算聚合。例如,我可能会说“有多少页面点击的 key3 值为 value3a”,或者“有多少页面点击的 key1 值为 value1,而 key3 的值为 value3b”。为了增加复杂性,最终可能会出现 key4 和 key5 等,并且可能没有足够的预警来能够在值出现之前进行维度模型更改。

一种方法可能是创建 3 个维度表,dim_key1dim_key2dim_key3,每个都有一个 id 字段和一个 value 字段。

那么我的事实表可能看起来像

id, session_id, dim_key1, dim_key2, dim_key3, count

这样做的缺点是我需要在我的事实表中创建 3 行,以便从查询字符串中正确捕获 key3 的 3 个值。此外,对于出现的每个维度,我都需要提前通知,并且需要创建我的新维度表。

另一种可能的方法,更适合 dim_key3,可能是创建一个维度表,如

id, value3a, value3b, value3c, ...

该表中的行由表示这些值组合的 1 和 0 组成。例如,上面的查询字符串会有一行看起来像1, 1, 1, 1, 0, 0, ...,而页面命中事实表的 dim_key3 维度 id 为 1。

从好的方面来说,每个页面点击在事实表中只有一个条目,并且维度表可以保持稀疏表示,我们只在其中为我们实际看到的组合创建新行(即我们不不需要所有 key3 组合的幂集)。不利的一面是,key3 的每个新值仍需要在该暗表中添加一个新列。

最后一个想法,对于dim_key3,应该有一个类似id, value_list 的表,其中value_list 存储以逗号分隔的值列表。它与“每个值的列”方法类似,但只是保持了更紧凑的表示。在这种情况下,我们可能有一个像1, "value3a,value3b,value3c" 这样的维度行。

同样,这只需要事实表中的一行,并且作为一个额外的优势,当新值出现时不需要新列。缺点是它迫使查询变得复杂,不得不进行全文匹配/正则表达式。 (如果有兴趣,我可以深入研究,但我觉得我已经进行了足够长的时间)。

我查看了几个参考资料,包括 Kimball 的“数据仓库工具包”,但没有找到任何可以直接回答我的问题的内容。大多数点击/网络/事件流分析维度模型示例都有一组固定不变且具有奇异值的变量。

我列出的三种方法中的任何一种是否合理,和/或是否有人对我错过的另一种模型有任何建议?

提前致谢!

【问题讨论】:

【参考方案1】:

如果事实表为页面加载和键之间的每个关联包含一行,那会怎样:

RowID, SessionID, PageLoadID, KeyValuePairID, DateKey, etc.

KeyValuePair 维度表将具有:

KeyValuePairID, Key, Value

因此,对于您的示例,您将创建维度行

1 key1 value1
2 key2 value2
3 key3 value3a
4 key3 value3b
5 key3 value3c

然后您可以执行相交查询以找到您的答案

Select Intersect(
    NonEmpty([Session].Members, [KeyValuePair].&[Key1][Value1]),
    NonEmpty([Session].Members, [KeyValuePair].&[Key3][Value3a])) on 0
From myCube

【讨论】:

比尔,感谢您的回复。只是想确保我理解你的建议,以及其中的一些含义。将任意/多值键值对放到它们自己的维度中看起来像是处理它们的非预定性质的好主意。然而,在事实表方面,这意味着对于每个页面加载,每个键值对仍然有一行。您是否建议将其作为单独的事实表提取出来? (下面续...) 我设想fact_page_load_static(或类似的)用于单值变量,而fact_page_load_variable 用于任意键值对?这样,我们就不必多次复制所有的单值数据了?这与您的建议相吻合吗?再次感谢!

以上是关于具有多个值的网络流的维度模型的主要内容,如果未能解决你的问题,请参考以下文章

网络流24题

网络流

UVa 11082 & 最大流的行列模型

浅谈网络流

[转]从入门到精通: 最小费用流的“zkw算法”

3.3 OpenFlow 流表