满足SAS数据仓库用户需求的实践指南
1. 数据管理以服务仓库用户
在数据系统中,无论是数据湖还是数据仓库,将数据访问权限仅授予经过批准的人员至关重要。接下来将详细介绍如何设置管理流程,以确保在向分析人员用户授予访问权限的同时,保障系统中的数据安全。
1.1 提供数据仓库应用程序的访问权限
通过数据仓库访问数据的分析人员被归类为基于应用程序的分析人员。在大型数据仓库应用程序中,可能存在基于应用程序的分析人员用户的子类。例如,医疗保健系统建立了一个数据集市,为该系统中病理实验室工作的基于应用程序的分析人员应被授予进行分析所需的数据表和工具的访问权限,但可能不应被授予访问放射科记录的权限,因为他们并非在放射科工作。
根据数据仓库应用程序中设置的业务规则,应创建基于应用程序的分析人员的子组,如实验室子组和放射科子组,并制定不同的策略集。授予访问权限的过程至少需要以下要素:
- 证明该人员符合该组的资格。
- 确保获得访问权限的人员已接受有关政策和程序的充分培训,特别是在数据隐私方面。
- 为将调整权限以授予该人员系统访问权限的技术人员提供明确的说明。
- 必要领导的批准文件。
授予数据库应用程序访问权限的政策通常作为更大的管理政策集的一部分编写,其中通常包括流程图,解释如何授予系统不同级别(包括开发人员级别)的访问权限,以及要使用的正式表格。这些政策和流程通常由数据管理委员会制定。
1.2 提供应用程序外的数据访问权限
在数据湖场景中,通常不使用应用程序来控制访问。相反,经过最少处理的数据集被放置在服务器上,通过授予服务器访问权限来控制访问。与应用程序一样,提供对以这种方式存储的数据的访问权限也需要一个批准过程,包括前面列出的四个要素。
需要注意的是,与通过应用程序访问数据的分析人员相比,访问数据湖数据的分析人员需要更多地依靠诚信系统。因此,授予分析人员对数据湖的访问权限应受到非常严格的审查。出于这个原因,数据湖可能选择不允许分析人员访问数据湖,而是安排一类开发人员,其职责是为未被授予数据湖服务器访问权限的分析人员用户创建分析数据集,然后将数据提取提供给分析人员进行分析。具体步骤如下:
1. 开发人员使用数据湖的文档与分析人员用户合作,确定分析人员所需的分析数据集的开发。
2. 开发人员然后组装分析人员指定的分析数据集,并将其传输给分析人员进行分析。
这种模式在数据隐私方面显然是最安全的,但需要大量的支持:
- 开发人员需要具备出色的沟通和客户服务技能,是熟练的程序员,同时还要了解数据湖中的数据集。
- 开发人员在传输分析数据集后需要持续支持分析人员,因为随着分析人员使用数据并对数据有更多了解,可能需要重新制作数据集。此外,分析人员在完成数据项目时可能会有问题。
- 分析人员和开发人员都需要大量的源文档和数据整理才能履行各自的职责。
2. 满足仓库结构产生的需求
以一个假设的用于探索美国退伍军人退役后生活质量(QoL)的数据仓库为例,使用2018年行为风险因素监测系统(BRFSS)数据集。该数据集非常适合存储在这样的数据仓库中,原因如下:
- 数据集非常大(超过400,000条记录),并且包含一个问题,受访者在其中表明他们的退伍军人身份,这使得仓库能够使用BRFSS数据对退伍军人和非退伍军人进行估计。
- 该调查每年进行一次,并且设计上问题每年变化不大,这为建立长期趋势提供了可能。
- 数据集已知有效且可靠,特征明确,有大量文档。它还包含许多有助于分析人员研究退伍军人生活质量的变量,如受访者是否患有各种疾病、受访者每晚的平均睡眠时间以及受访者使用医用大麻的情况。
- 数据集包含外键或索引,允许它与其他数据集连接。具体来说,它包含一个州地理变量的代码(_STATE),可用于将其他州级数据连接到仓库中。
3. 考虑数据仓库中的地理变量
地理变量对于数据仓库尤为重要,因为它们可以极大地提高数据分析的可能性。BRFSS包括通过公共识别号码(FIPS号码)识别受访者居住州的变量(_STATE),还包括州内较小地理分组(县)的变量,也用FIPS号码识别。为了简化演示,这里只处理州级数据,但在实际场景中,如果可用,还应包括县级和城市级等较低级别的地理变量。
这些特征为通过在仓库中创建和提供额外数据来满足数据仓库分析人员用户的需求提供了机会:
- 提供相关数据:BRFSS数据包括受访者的居住州,该变量的编码方式使得可以从其他数据集中获取关于同一州的其他数据(如退伍军人数量)并添加到数据仓库中,州代码可以用作外键。
- 提供交叉变量:BRFSS数据包含一些随时间变化且不同年份不可比的变量。对于这些情况,数据仓库可以添加创建一个标准化分组变量的变量,称为交叉变量,可长期使用。
下面使用假设的退伍军人数据仓库和2018年BRFSS数据集进行演示。用于演示的数据集为SAS格式,名为Chap10_1,应将其放入映射到LIBNAME X的目录中,并运行以下代码:
LIBNAME X "/folders/myfolders/X";
RUN;
PROC CONTENTS data=X.chap10_1 VARNUM;
RUN;
该代码将LIBNAME X映射到所选目录,然后对数据集运行PROC CONTENTS,使用VARNUM选项,以便按创建顺序打印变量。数据集中只有四个变量,下面是这些变量的信息:
| 变量 | 说明 |
| ---- | ---- |
| _STATE | 州的两位数代码,FIPS代码,可作为外键与其他州级信息数据集连接 |
| VETERAN3 | 表明BRFSS中谁是退伍军人,谁不是 |
| MARIJAN1 | 询问受访者在过去30天内使用大麻的频率,代码手册中未记录该变量 |
| USEMRJN2 | 询问使用大麻的最常见方式,仅对报告使用大麻的受访者提问,有多个响应类别 |
_STATE变量将用于演示如何将其他数据连接到仓库以更好地满足用户需求,大麻变量将用于演示如何创建交叉变量以满足进行纵向分析的用户的需求。
4. 添加、使用和提供外键
在数据表格中,主键是唯一定义表中每一行的列,而外键是表中某一列存储的数字,它唯一引用另一个表中的另一条记录(通常是通过引用另一个表中的主键)。例如,_STATE变量可以看作是一个外键,它可以引用一个使用FIPS表中的主键来解码州的FIPS表,因为FIPS代码12唯一标识了“佛罗里达”这个描述。
提供来自公共领域的外键(如FIPS代码)可以通过在数据仓库中提供有用的变量来帮助分析人员,这些变量允许分析人员通过添加来自不同来源的更多信息来丰富仓库中的数据。
4.1 使用外键向仓库添加数据
假设数据仓库是关于美国退伍军人退役后的生活质量,了解他们退役后的收入比较情况可能会有所帮助。美国人口普查局建立了退伍军人退役后1年、5年和10年的州级收入测量数据,可从互联网上以*.csv格式下载。由于我们对退伍军人退役后的生活质量感兴趣,因此最关注他们退役后5年和10年的数据。尽管我们有2018年的BRFSS文件,但在人口普查数据中,最接近2018年的数据是2010年计算的退役后5年的估计数据。
在审查人口普查数据集的数据字典时,我们发现地理列中有州的FIPS代码,还有退伍军人工资的第75百分位数测量值y5_p75_earnings。我们仅获取2010年这两个变量的数据,该演示数据集名为vet_2010_5yrEarnings.csv,部分数据如下:
| geography(FIPS代码) | y5_p75_earnings(第75百分位数年薪) |
| ---- | ---- |
| 12(佛罗里达) | $54,610 |
| 25(马萨诸塞州) | $66,100 |
| 27(明尼苏达州) | $54,100 |
使用BRFSS数据集中的FIPS代码作为外键,我们可以将y5_p75_earnings值连接并添加到我们的数据中。具体步骤如下:
1. 将退伍军人收入数据集vet_2010_5yrEarnings.csv转换为SAS数据集。将该数据集放在映射到LIBNAME X的目录中,并运行以下PROC IMPORT代码将其转换为WORK目录中名为vet_a的SAS数据集,然后运行PROC CONTENTS验证数据是否成功导入:
FILENAME REFFILE '/folders/myfolders/X/vet_2010_5yrEarnings.csv';
PROC IMPORT DATAFILE=REFFILE
DBMS=CSV
OUT=WORK.vet_a;
GETNAMES=YES;
RUN;
PROC CONTENTS DATA=vet_a;
RUN;
- 将BRFSS数据集X.Chap10_1读取到WORK目录中,命名为brfss_a。
data brfss_a;
set X.Chap10_1;
RUN;
- 在进行合并之前,将vet_a数据集中的FIPS变量从geography重命名为_STATE,以方便在SAS中进行合并操作。
data vet_b;
set vet_a (RENAME = (geography = _STATE));
RUN;
- 由于将使用_STATE作为索引变量连接两个数据集,因此需要先对两个数据集按_STATE进行排序。
PROC SORT data = vet_b;
by _STATE;
RUN;
PROC SORT data = brfss_a;
by _STATE;
RUN;
- 在合并之前,运行PROC FREQ对合并前的数据集brfss_a按_STATE进行单因素频率分析,以监控合并过程中记录数量是否出现错误。
PROC FREQ data = brfss_a;
tables _STATE;
RUN;
- 使用数据步合并vet_b数据集中的y5_p75_earnings变量到brfss_a数据集中,创建新数据集brfss_b。
data brfss_b;
merge brfss_a (IN = In1) vet_b (IN = In2);
by _STATE;
if (In1 = 1 and In2 = 1) then output brfss_b;
RUN;
PROC CONTENTS data = brfss_b VARNUM;
RUN;
PROC FREQ data = brfss_b;
tables _STATE;
RUN;
合并代码解释如下:
- 合并语句中使用IN选项,IN变量是一个临时变量,如果记录在数据集中则设置为1,否则设置为0。
- by _STATE语句确保两个数据集按_STATE排序后进行合并,_STATE作为索引变量用于确定In1和In2的值。
- if (In1 = 1 and In2 = 1) then output brfss_b语句表示只有当记录同时存在于brfss_a和vet_b中时,才输出到brfss_b数据集中。
- 合并完成后,运行PROC CONTENTS和PROC FREQ对brfss_b数据集进行验证,确保新变量成功合并,并且记录数量没有变化。
通过这种方式,我们可以使用外键将不同来源的数据连接到数据仓库中,以满足用户的分析需求。
5. 处理仓库中的多个外键
在某些情况下,不同数据集中的州级数据可能没有以相同的方式格式化州变量,这就需要处理多个外键。假设我们想将美国医院目录(AHD.com)的数据添加到仓库中,但该数据集中没有FIPS代码,唯一可以用来将数据连接到BRFSS数据的外键是State_Desc变量。这就需要一个包含FIPS代码到State_Desc的交叉数据集,交叉表的列信息如下:
| 列名 | 说明 |
| ---- | ---- |
| State_FIPS | 包含FIPS代码,与_STATE的值相同,但在交叉数据集中名为State_FIPS |
| State_Abbrev | 两位数的州缩写,是许多政府数据集中使用的外键 |
| State_Desc | 另一个州的外键,反映在AHD数据中 |
将医院数据添加到BRFSS数据集的步骤如下:
1. 导入AHD数据(AHD.csv)到一个SAS数据集(ahd_a)。
FILENAME REFFILE '/folders/myfolders/X/AHD.csv';
PROC IMPORT DATAFILE=REFFILE
DBMS=CSV
OUT=WORK.ahd_a;
GETNAMES=YES;
RUN;
PROC CONTENTS DATA=ahd_a;
RUN;
- 导入交叉数据(State_xwalk.csv)到一个SAS数据集(xwalk_a)。
FILENAME REFFILE '/folders/myfolders/X/State_xwalk.csv';
PROC IMPORT DATAFILE=REFFILE
DBMS=CSV
OUT=WORK.xwalk_a;
GETNAMES=YES;
RUN;
PROC CONTENTS DATA=xwalk_a;
RUN;
- 在xwalk_a中,将FIPS代码重命名为_STATE,输出xwalk_b数据集。
data xwalk_b;
set xwalk_a (RENAME = (State_FIPS = _STATE));
RUN;
- 对xwalk_b和brfss_b按_STATE排序,然后使用合并函数连接交叉变量,输出brfss_c数据集。
PROC SORT data = xwalk_b;
by _STATE;
RUN;
PROC FREQ data = brfss_b;
tables _STATE;
RUN;
data brfss_c;
merge brfss_b (IN = In1) xwalk_b (IN = In2);
by _STATE;
if (In1 = 1 and In2 = 1) then output brfss_c;
RUN;
PROC CONTENTS data = brfss_c VARNUM;
RUN;
PROC FREQ data = brfss_c;
tables _STATE;
RUN;
- 对ahd_a按State_Desc排序,对brfss_c按State_Desc排序,然后将它们合并到brfss_d。
PROC SORT data = ahd_a;
by State_Desc;
RUN;
PROC SORT data = brfss_c;
by State_Desc;
RUN;
PROC FREQ data = brfss_c;
tables _STATE;
RUN;
data brfss_d;
merge brfss_c (IN = In1) ahd_a (IN = In2);
by State_Desc;
if (In1 = 1 and In2 = 1) then output brfss_d;
RUN;
PROC CONTENTS data = brfss_d VARNUM;
RUN;
PROC FREQ data = brfss_d;
tables _STATE;
RUN;
通过以上步骤,我们可以成功处理多个外键,将不同来源的数据整合到数据仓库中,以满足更复杂的分析需求。
满足SAS数据仓库用户需求的实践指南
6. 合并操作中的IN临时变量及SQL类比
在数据步合并操作中,IN临时变量起着关键作用。以之前的
brfss_a
和
vet_b
数据集合并为例,回顾合并代码:
data brfss_b;
merge brfss_a (IN = In1) vet_b (IN = In2);
by _STATE;
if (In1 = 1 and In2 = 1) then output brfss_b;
RUN;
这里的
IN
选项创建了临时变量
In1
和
In2
。
In1
用于跟踪
brfss_a
中的记录,若记录在该数据集中,
In1
为1,否则为0;
In2
用于跟踪
vet_b
中的记录。
可以通过一个mermaid流程图来理解这个过程:
graph LR
A[开始数据步brfss_b] --> B[合并brfss_a和vet_b]
B --> C{记录在brfss_a吗?}
C -- 是 --> D{记录在vet_b吗?}
C -- 否 --> E[不输出]
D -- 是 --> F[输出到brfss_b]
D -- 否 --> E
在SQL中,这种合并方式类似于内连接(inner join)。如果在合并时指定
if (NOT In1 and In2)
,则类似于SQL中的外连接(outer join)。以下是相应的代码示例:
data other_option;
merge brfss_a (IN = In1) vet_b (IN = In2);
by _STATE;
if (In1 and In2) then output other_option;
RUN;
data no_match;
merge brfss_a (IN = In1) vet_b (IN = In2);
by _STATE;
if (NOT In1 and In2) then output no_match;
RUN;
对于SQL程序员来说,还可以通过下面的mermaid流程图理解如何在数据步中实现左连接和右连接:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始数据步]):::startend --> B(合并数据集):::process
B --> C{条件判断}:::decision
C -- 满足条件 --> D(输出到结果数据集):::process
C -- 不满足条件 --> E(不输出):::process
D --> F([结束数据步]):::startend
E --> F
通常,数据仓库ETL中的合并操作主要关注内连接,就像
vet_b
和
brfss_a
的合并一样。但当不同数据集中的州级数据没有以相同方式格式化州变量时,就需要处理多个外键。
7. 数据合并的验证与监控
在数据合并过程中,验证和监控数据的准确性非常重要。在将
vet_b
中的
y5_p75_earnings
变量合并到
brfss_a
创建
brfss_b
的过程中,我们进行了以下验证操作:
-
合并前的频率分析
:
PROC FREQ data = brfss_a;
tables _STATE;
RUN;
通过这个操作,我们得到了合并前
brfss_a
中
_STATE
变量的频率分布。例如,
_STATE = 12
有大约15,000条记录,
_STATE = 25
有超过6,000条记录,
_STATE = 27
有近17,000条记录。
-
合并后的频率分析
:
PROC FREQ data = brfss_b;
tables _STATE;
RUN;
将合并后的频率分布与合并前的进行比较,确保记录数量没有错误地增加或减少。如果数量发生变化,可能意味着合并过程中存在错误,比如
vet_b
数据集中的FIPS代码分配错误。
同样,在将
ahd_a
数据合并到
brfss_c
创建
brfss_d
的过程中,也进行了类似的验证操作:
PROC FREQ data = brfss_c;
tables _STATE;
RUN;
PROC FREQ data = brfss_d;
tables _STATE;
RUN;
8. 总结与最佳实践
通过以上的操作和分析,我们可以总结出一些在SAS数据仓库中满足用户需求的最佳实践:
-
数据访问管理
:
- 为不同类型的用户(如基于应用程序的分析人员)制定明确的数据访问政策,包括访问权限的审批流程和必要的培训。
- 在数据湖场景中,谨慎授予分析人员访问权限,可考虑通过开发人员提供分析数据集。
-
数据合并与外键使用
:
- 利用外键(如FIPS代码)将不同来源的数据连接到数据仓库中,丰富数据内容。
- 在合并数据时,确保索引变量名称一致,并对数据集进行排序。
- 使用
IN
临时变量和条件判断来控制合并结果,类似于SQL中的连接操作。
-
数据验证与监控
:
- 在合并前后使用
PROC FREQ
对关键变量进行频率分析,监控记录数量的变化,确保数据的准确性。
遵循这些最佳实践,可以有效地满足SAS数据仓库用户的需求,提高数据的可用性和分析的准确性。
通过上述步骤和方法,我们可以在SAS数据仓库中更好地管理数据访问、合并不同来源的数据,并确保数据的准确性和安全性,从而为用户提供更有价值的数据分析支持。
超级会员免费看
705

被折叠的 条评论
为什么被折叠?



