是否可以在 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()中设置线程的优先级?