是否可以在data.cube R中设置带有雪花模式的多维数据集?

时间:2016-11-02 10:27:45

标签: r data.table olap olap-cube data.cube

或者,尺寸可以以某种方式嵌套在data.cube中吗?

给出以下示例(通过R上的?data.cube访问,已安装last branch of data.cube-oop package@jangorecki),我发布了代码和图片示例。

考虑我想扩展多维数据集,添加一个新的维度,将架构转为雪花,所以对于每个地理位置,我会有另一组数据(data.table)来描述人口统计属性(即人口基于性别,年龄等)

图像

Snowflake Schema example image

点缀:可能的新尺寸。

黑色:代码示例中的实际事实和维度。

green:将模式转换为雪花的新维度。

代码

# multidimensional hierarchical data from fact and dimensions
X = populate_star(N = 1e3)
sales = X$fact$sales
time = X$dims$time
geography = X$dims$geography
# define hierarchies
time.hierarchies = list( # 2 hierarchies in time dimension
    "monthly" = list(
        "time_year" = character(),
        "time_quarter" = c("time_quarter_name"),
        "time_month" = c("time_month_name"),
        "time_date" = c("time_month","time_quarter","time_year")
    ),
    "weekly" = list(
        "time_year" = character(),
        "time_week" = character(),
        "time_date" = c("time_week","time_year")
    )
)
geog.hierarchies = list( # 1 hierarchy in geography dimension
    list(
        "geog_region_name" = character(),
        "geog_division_name" = c("geog_region_name"),
        "geog_abb" = c("geog_name","geog_division_name","geog_region_name")
    )
)
# create dimensions
dims = list(
    time = as.dimension(x = time,
                        id.vars = "time_date",
                        hierarchies = time.hierarchies),
    geography = as.dimension(x = geography,
                             id.vars = "geog_abb",
                             hierarchies = geog.hierarchies)
)
# create fact
ff = as.fact(
    x = sales,
    id.vars = c("geog_abb","time_date"),
    measure.vars = c("amount","value"),
    fun.aggregate = sum,
    na.rm = TRUE
)
# create data.cube
dc = as.data.cube(ff, dims)
str(dc)

与该示例相关的其他问题是:

每个元素的预期值是多少?为什么 "time_week" = character() "time_date" = c("time_week","time_year") 代替 "time_week" = character() "time_date" = date() 以及为什么在data.table列中命名? "time_quarter" = c("time_quarter_name"), "time_month" = c("time_month_name")

1 个答案:

答案 0 :(得分:0)

多维数据集模型是用户无需处理的底层结构。 data.cube-oop使用以下data model 准确地去你的例子。您不能以这种方式在雪花模式中添加新维度。必须将新维度连接到事实表。雪花模式中未直接连接到事实表的表只是维度中的层次结构级别。在您的示例中,这意味着客户维度只是地理维度的更高级别属性。您可能最终会做相反的事情,创建客户维度,并在更高级别的客户层次结构中保留地理属性 无论如何,您决定这样做,您必须从每个单独的表创建您的维度(当然可以是相同的宽表)。你不能通过单独提供它来构建维度,这将比单个非规范化维度表更令人困惑,这是用户最常处理的事情。 因此,为了将地理属性保留在客户维度中,只需在您的客户表中查找地理值,并为as.dimension提供新表。

至于问题的第二部分,层次结构列表定义层次结构中属性之间的关系,而不是数据类型。 LHS上的列名称定义层次结构级别中的键列,而RHS定义将在该特定级别上存在的依赖属性。您基本上定义哪个列在层次结构中的哪个级别上,较低级别必须引用上级以创建真正的层次结构。这是由数据的唯一性强制执行的,即每个time_month_name必须只有一个time_month
要更好地了解这种关系,请尝试以下方法:

library(data.cube)
X = populate_star(N = 1e3)
dc = as.data.cube(X)
dc$dimensions$time$levels

它将按时间维度打印所有层次结构级别,每个层次结构级别是一个单独的表。