我收到了以下格式的大量样本:
<timestamp> <dim1> <dim2> <dim3> 324
<timestamp> <dim1> <dim2> <dim3> 3565
<timestamp> <dim1> <dim2> <dim3> 122
<timestamp> <dim1> <dim2> <dim3> 2333
324,3565,...是测量值,我想将它们存储在数据仓库中。
测量值将四舍五入到最接近的百位(300,3600,100,2300)。
我如何存储这个并快速创建事实的直方图?
一种(坏)方法是在事实表中为每个“桶”(即100,200,300,...)添加一列,然后在每列上使用SUM()来构建直方图。缺点是显而易见的:事实表将是巨大的和非灵活的(样本范围有限)
任何人都有任何聪明的想法?
答案 0 :(得分:0)
嗯,你必须以某种方式离婚。一种方法 - 假设您的存储区范围不经常更改 - 是添加一个范围(dimBucket
)的表,并在ETL期间为每个值分配一个存储桶密钥。如果值范围发生变化,则必须重新计算整个事实表以分配新的BucketKeys
。所以,像这样 - 注意ValueRange
是一个像'100-199', '200-299', ...
SELECT
ValueRange
, sum(SaleAmount) AS SaleValue
, count(1) AS Transactions
from factSale AS f
JOIN dimBucket AS b ON b.BucketKey = f.BucketKey
GROUP BY ValueRange;
我发现很难使用通用<dim>, <dim>, <dim>
,所以我使用了自己的例子。
另一种方法是不要在DW级别考虑它,而是使用分析包。几乎每个分析/数据挖掘包都提供了几种类型的离散化。试试Weka,它是开源的,相当不错; R也很受欢迎。