文章
Jingwei Wang · 七月 21 阅读大约需 10 分钟

DeepSee 的开发 - 第二部分 - 创建Cube

创建Cube

点击主页,Analytics - > 模型。

  1. 点击新建。系统会显示一个对话框。
  2. 在这个对话框中,指定以下内容。 
    • 定义类型。选择 Cube 。
    • 多维体名称 - Tutorial
    • 多维体的类名 - Tutorial.Cube
    • 源类 - 点击浏览按钮,选择BI.Study.Patient,然后点击确定。

系统会创建cube类,你也可以在Studio中查看和修改。

  1. 点击中间区域的粗体顶行(标有Tutorial)。这将选择cube,这样你就可以在右边编辑它的细节。
  2. 在细节栏中,将None键入空替换字符串。点击保存,然后点击确定。系统会更新cube类。
  3. 左边的区域叫做类浏览器。

类浏览器提供了你的基类的类属性(除了关系属性)的有用视图,这使得基于这些属性创建DeepSee元素非常容易。然而,重要的是要知道,尽管这个视图提供了一个访问某些属性的方便方法,你也可以使用源表达式来访问任何数据。这些源表达式是在构建cube时进行评估的,因此不会影响你的运行时性能。

 

添加levels和度量

  1. 将以下项目从类浏览器(左侧区域)拖放到模型浏览器(中间区域)的度量标题下。这将创建名为Age和TestScore的度量,基于这些名字的类属性。
    • Age
    • TestScore
  2. 对TestScore度量做如下修改。
    • 单击 "度量 "标题下的度量名称。
    • 在 ‘详细信息’ 栏中,将名称改为 "Test Score"。
    • 选中 "可搜索"。
  3. 按以下方法创建Avg Age度量。
    • 再次将Age属性从类浏览器中拖放到模型浏览器的度量标题下,这一步创建了一个名为Age1的新度量。
    • 单击模型查看器中的度量名称,然后在‘详细信息’ 栏中编辑以下内容:
      • 名称 - 指定Avg Age。
      • 汇总 - 选择AVG。
      • 格式字符串 - #.###。
  4. 按以下方法创建Avg Test Score度量。
    • 再次将TestScore属性从类浏览器中拖放到模型浏览器的度量标题下。这一步创建了一个名为TestScore1的新度量。
    • 点击模型查看器中的度量名称,然后在 ‘详细信息’ 栏中编辑以下细节。
      • 名称 - 指定Avg Test Score。
      • 汇总 - 选择AVG。
      • 格式字符串 - #.##。

 

  1. 点击保存,然后点击确定,系统会更新cube类。
  2. 添加一个基于Age属性的维度、levels和层次结构。
    • 把 Age 属性拖到维度标题下。
    • 模型立即创建一个维度,levels和层次结构,模型浏览器现在显示如下。
    • 在右边区域,编辑 名称 为 AgeD。
    • 维度的名称取决于你打算如何使用DeepSee,用户可能永远不会看到维度的名称。在本教程中,我们遵循Patients样本中使用的惯例,假设我们不会在透视表中使用维度作为行或列(而是使用级别作为行或列)。
    • 选择选项 "为该维度启用所有级别"。
    • 将All成员的标题编辑为All Patients。
    • 编辑All成员的显示名称为All Patients。
  3. 按照之前的方法保存cube定义。
  4. 在Gender属性的基础上添加一个维度、levels和层次结构。重复前面的步骤,但有以下不同。
    • 拖放Gender属性。
    • 将维度重命名为GenD。
    • 不要选择选项 "为这个维度启用所有级别"。
  5. 根据HomeCity属性添加一个维度、层次结构和levels。重复前面的步骤,但有以下不同。
    • 展开HomeCity属性,然后将此文件夹内的名称属性拖放到维度中。
    • 将维度重命名为HomeD
    • 将Level重命名为 City,不要为这个维度选择启用所有级别的选项。
    • City层的属性使用HomeCity.Name
  6. 为City层添加属性。
    • 展开左边类浏览器区域的HomeCity。
    • 拖动Population并把它放到中间区域的City层。
    • 拖动PrincipalExport并将其放到中间区域的City层上。
    • 选择新的PrincipalExport属性并将其重命名为Principal Export。
  7. 在PrimaryCarePhysician属性的基础上添加一个维度、levels和层次结构。
    • 点击添加元素。
    • 在输入新元素名称时,输入DocD。
    • 选择数据维度。
    • 点击确定。
    • 在模型查看器区域点击New_Level1。
    • 将名称改为Doctor。
    • 在Expression中键入以下ObjectScript表达式: 变量%source指的是当前记录。
      %source.PrimaryCarePhysician.LastName_", "_%source.PrimaryCarePhysician.FirstName
  8. 按照你之前的方式保存cube定义。
  9. 编译和构建cube。
    • 点击编译,开始编译并在对话框中显示进度。
    • 当系统编译完成后,单击 "完成"。
    • 点击构建,然后点击构建。
    • 当系统完成构建cube和它的索引时,点击 "完成"。
  10. 打开一个单独的管理门户,Analytics - > 分析器。
  11. 检查左上方的区域(cube图标),它显示了当前选择的cube或主题区的标题。
  12. 如果标题不是Tutorial,选择Tutorial,并点击确定。分析器的左边区域显示这个cube的当前内容,如下。 

初级Cube

为了检查cube,我们将通过把cube元素从左侧区域拖放到Pivot Builder区域来创建简单的透视表。

  1. 首先要注意的是,分析器显示了一个我们没有定义的度量(Count)。这个度量是自动提供的,它对基类中的记录进行计数。

做以下工作来熟悉这个新的cube。

  1. 点击左边区域中每个维度名称旁边的三角形。
  2. 将Age层拖放到行区。你应该看到像这样的东西。 注意:这个层次的成员是以字符串的形式排序的。对于这个层次,最好是对成员进行数字排序,所以我们必须对这个层次进行调整。
  3. 把Doctor层拖到行区,直接放在Age上。(在这个动作中,你用Doctor代替Age。) 注意:与这里创建的其他维度不同,医生维度可以有非常多的成员,这取决于你数据集的大小。在现实世界的实施中,你不太可能在如此低的水平上创建一个维度。本教程使用这个维度来演示几个关键点。 第一个医生名称“,” 是指没有记录主治医生的病人(对于这些病人,PrimaryCarePhysician字段的姓和名都是空的)。当我们在教程的下一部分中重新定义这个级别时,我们将改变这一点。 每当你创建一个基于标识符的级别时,必须考虑该标识符是否是唯一的。在许多情况下(产品名称、程序代码、部门名称等),标识符是唯一的。然而,假设人的名字是唯一的并不安全。因为我们直接以医生的名字为基础,DeepSee将任何有相同名字的医生结合起来。在本教程的后面部分,我们将使用一个更稳健的方法。
  4. 将Gender层拖放到行区,将其直接放在Doctor的上面。这个动作将Doctor层替换为Gender层。现在你应该看到像这样的东西。
  5. 展开左边的City层。你应该看到这个。
  6. 把City层拖到行区,直接放在Gender层的上面。现在你应该看到像这样的东西。
  7. 将Population和Principal Export属性拖放到列中。你应该看到这个。  我们将不需要对这个级别做任何修改。

 

 

完善cube

我们将对cube做如下修改。

  1. 改变Age的成员的排序方式。
  2. 确保Doctor级别不合并具有相同名字的医生。
  3. 确保Doctor层有一个名为None的成员,而不是逗号。
  4. 访问模型,它显示了你上次查看的cube定义。
    • 首先,重新定义Age层,使其成员按数字排序。
      • 点击Age层。
      • 点击添加元素。
      • 键入 AgeSort
      • 点击属性。
      • 点击 OK。
      • 系统添加属性并在架构中选择它。
      • 在详细信息栏中,选择表达式并输入以下内容: 这个表达式在年龄上增加了前导零,所以字符串排序会导致年龄的正确排序。第一个年龄是01,第二个是02,以此类推。(这个样本中最高的年龄是99岁,所以没有年龄超过两个字符的。)
        $CASE($LENGTH(%source.Age),2:%source.Age,:"0"_%source.Age)
        对于按属性值排序的成员,选择asc。这个选项使系统使用这个属性的值来控制成员的排序方式。
  5. 保存cube。
  6. 再次重新定义Doctor级别,使其不能合并具有相同名字的医生。
    • 点击Doctor级别。
    • 选择表达式字段中的值,把它复制到记事本或其他临时位置。
    • 选择属性并输入PrimaryCarePhysician
    • 现在Doctor级别是基于PrimaryCarePhysician属性,对每个医生来说是唯一的。
    • 这确保了该级别不会将碰巧有相同名字的不同医生结合起来。这一步也确保没有医生的病人的值是空的;
    • 当Doctor级别被选中时,点击添加元素。
    • 对于输入新元素名称,键入Doctor Name
    • 点击属性。
    • 点击确定。
    • 在详细信息栏中,选择表达式并输入以下内容。
      %source.PrimaryCarePhysician.LastName_", "_%source.PrimaryCarePhysician.FirstName
      此选项使系统使用此属性的值作为每个成员的名称。对于按属性值排序的成员,选择asc。这个选项使系统按照这个属性的值对成员进行升序排序。
  7. 编译cube。
  8. 构建cube
  9. 进入分析器,点击DeepSee > 分析器链接。
  10. 当你把年龄拖放到行中时,你会看到以数字顺序排序的成员。
  11. 当你拖放Doctor到行中时,你会看到None。
  12. 根据生成的数据,你可能还会看到重复的医生名字。说明医生级别有重复的名字。

 

在cube中添加一个列表

列表使用户能够从最底层的数据中看到选定的字段,这在许多情况下是很有用的。这些信息可以帮助用户识别离群记录或任何可能需要后续活动的记录。

  1. 首先,让我们检查一下Patients表中的可用字段。
  2. 进入管理门户,进入SAMPLES命名空间,点击系统资源管理器>SQL。执行下面的查询。
    select * from BI_Study.Patient
    现在试试下面这样的查询。
    select PatientID, Age,TestScore,HomeCity->Name as "City",
    PrimaryCarePhysician->Lastname as "Doctor" from BI_Study.Patient
  3. 将查询结果复制到记事本或任何其他方便的临时位置。
  4. 添加一个列表,使用我们刚刚运行的查询中的字段。
    • 访问模型。
    • 点击 Add Element。
    • 对于输入新元素名称,键入 Sample Listing。
    • 点击列表。
    • 点击 OK。
    • 在 "详细信息 "窗格中,将先前保存的查询中的字段列表复制到字段列表区域。
      PatientID, Age,TestScore,HomeCity->Name as "City", PrimaryCarePhysician->Lastname as "Doctor"
      系统会使用这个字段列表并建立SQL查询。
  5. 编译这个cube。
  6. 进入分析器。
  7. 点击透视表预览区的一个单元格。
  8. 点击显示列表按钮(望远镜图标)
  9. 如果你得到一个不支持列表的信息,请确保你保存并重新编译了cube。
  10. 修改列表,以不同的方式对记录进行排序。
    • 再次访问模型。
    • 点击模型内容区的列表。
    • 在详细信息栏中,在 Order By 中输入以下内容。
      Age,HomeCity->Name 
  11. 编译这个cube。
  12. 验证列表现在是按年龄排序,然后按年龄内的城市排序。

 

事实表

如果你负责创建cube定义,了解DeepSee如何使用cube定义来建立DeepSee直接使用的表:事实表和水平表是很有用的。在本节中,我们将研究这些表。

  1. 进入管理门户,进入SAMPLES命名空间,如前所述。点击系统资源管理器 > SQL。执行下面的SQL查询,它针对你的cube使用的基础表运行。
    select top 1 Age,Gender,HomeCity->Name,
    PrimaryCarePhysician->Lastname,TestScore from BI_Study.Patient
  2. 在左边区域,导航到表Tutorial_Cube.Fact。点击打开表。这个表是在你编译cube时生成的,在你构建cube时被填充。事实表对它从源表中使用的每条记录都有一条记录(称为事实)。在这种情况下,每个事实对应于一个病人。 这张表的第一行与基础表中的第一行相对应(他是13岁,考试成绩是88分)。 注意以下几点:
    • %sourceId字段表示事实所依据的源记录的ID。
    • 每个名字以Dx开头的字段对应于你定义的级别。例如DxAge,DxGender级别,D - Dimension
    • 每个名字以Mx开头的字段对应于你定义的测量。例如MxAge,M - Measure
    • 对于某些事实,MxTestScore字段的值为空。
  3. 点击关闭窗口。
  4. 导航到表Tutorial_Cube.StarGender。
  5. 点击打开表。这个表包含性别级别成员的名字。事实表的DxGender字段指的是这个表中的行。 在你的案例中,你可能看到Male在Female之前。在这种情况下,女性成员在前,因为系统处理的第一个病人是女性。当系统填充这些表时,它遍历基表中的记录。对于每条记录,系统会查看每个级别的定义,确定一个值,将该值(如果需要)添加到相应的级别表中,并将查询值写入事实表的级别字段中。
  6. 点击关闭窗口。
  7. 导航到表Tutorial_Cube.StarAge。 年龄级别是由基类的年龄字段定义的;该值显示在DxAge列。这个级别有一个级别属性,用于定义级别成员的排序顺序;该值显示在Dx781900468列中。这个级别表中的第一条记录对应于13岁的年龄,即本例中系统处理的第一个病人。
  8. 点击关闭窗口。
  9. 导航到表Tutorial_Cube.StarNameViaHomeCity。城市级别由基类中的HomeCity->Name字段定义;该值显示在DxNameViaHomeCity列中。这个级别有两个级别属性,在其他列中显示。该表的第一条记录是Magnolia,即基表中第一个病人的家乡城市。
  10. 点击关闭窗口。
  11. 导航到表Tutorial_Cube.StarPrimaryCarePhysician。医生级别是由基类中的PrimaryCarePhysician字段定义的,它是对DeepSee.Study.Doctor类实例的引用(OREF)。系统将OREF转换为一个整数,并将其写入DxPrimaryCarePhysician列中。对于这个级别,成员的名字是由一个级别属性定义的,这个属性把姓和名连接起来,中间用逗号。这个级别属性的值被存储在Dx582175229列中。空医生的名字是一个逗号,但这个名字永远不会显示;相反,对于这个成员,系统使用你指定的空替换字符串。
  12. 为了使这些表中的字段名更有用,你可以为你定义的级别和度量指定选项Field name in fact table。注意,这个选项不适用于时间级别(在下一章讨论),它有特殊的内部处理。
0
0 24
讨论 (0)1
登录或注册以继续