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

Posted

技术标签:

【中文标题】是否可以在 data.cube R 中设置具有雪花模式的多维数据集?【英文标题】:Is it possible to set a cube with a snowflake schema in data.cube R? 【发布时间】:2016-11-02 10:27:44 【问题描述】:

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

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

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

图片

虚线:可能的新维度。

黑色:代码示例中的实际事实和尺寸。

绿色:将架构变成雪花的新维度。

代码

# 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】:

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


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

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

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

【讨论】:

以上是关于是否可以在 data.cube R 中设置具有雪花模式的多维数据集?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在Stream.parallel()中设置线程的优先级?

是否可以通过 JavaScript 中的浏览器确定操作系统中设置的用户区域设置的**国家**?

QImage在具有透明度的PNG中设置alpha

在 R 中设置函数参数的默认值

Ionic 3 - 在警报控制器中设置 id 值

如何在实时服务器中设置多个站点?