
SAS—HASH对象的应用
HASH table原理
先介绍下hash的原理吧。hash table其实就是散列表,也叫哈希表,根据关Key-value键值对而直接进行访问的数据结构。它通过把key-value映射到表中一个位置来访问记录,不用扫描整张表以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。
在数据装载时,根据F(key)=内存地址将表存到内存中指定的地址。
比如我最爱的杰伦,根据散列函数F(周杰伦) = 18 就可找到对应的value为87啦。
sas hash table 的优点
hash table是 SAS 查找技术中最为常用的技术啦,性能表现经评测也比较上乘,在SAS 产品中已被广泛使用,同时也深受国外SAS程序员的喜爱,但在国内大家好像并不怎么常用。但是想想可以用sas hash提高下数据查询的效率,是不是在小伙伴面前有些小逼格呢!?
下面呢就介绍下sas hash table的优点:
1.hash table 可以根据 K-V 定位数据,直接得到变量的存储地址,可以减少查询的次数;
2.hash table的变量查找是在内存中进行的,可以提高性能;
3.hash table可以在data步运行时的动态地添加、更新、删除等操作;
4.hash 可以做一些merge 和 proc sql 难以实现的数据集合并,并在细节上可以有更多的控制。
当然,因为sas hash是在内存中运行,所以如果数据太大,还是不要用hash对象了。
sas 定义hash对象
Hash对象的最基本的要点有三个:
(1)要放入内存中的表
(2)用来通过hash函数建立与内存对应存储地址的KEY值(可以是数值、字符或者两者的混合,最好是表的主键否则只有第一条记录有效,因为key值相同通过F(key)只会指向一个地址)。
(3)要调入内存中与key值一起构成数组的变量.
在SAS中分别通过以下步骤来完成上述三个要点:
hash的使用实例
(1)通过hash可以实现表与表的高效关联
(2)可以对hash表中的数据进行控制设计巧妙的算法。下边是一些具体的例子:
使用hash对象来筛选数据
/*新入职员工信息*/
data id_newly;
input id $ epl_ym;
cards
;
1101 201201
1102 201201
1123 201203
1105 201202
1104 201202
1105 201202
;
run;
如下图所示:
/*创建每位员工的销售级别及销售额*/
data sales_all;
input id $ grade $ amt;
cards
;
1001 a 561
1101 c 256
1002 b 421
1003 a 691
1005 a 555
1004 b 398
1015 a 402
1102 c 128
1123 d 96
1105 c 196
1104 d 89
1086 b 632
1093 a 701
1115 c 221
;
run;
如下图所示:
/*使用hash对象筛选新员工的销售额*/
data sales_newly;
length id $8. epl_ym 8.;/*定义数据变量id、epl_ym类型和长度,此处将变量类型和长度写死在程序里,这样当查找表的数据结构发生变化时还要重写代码。以后会单独介绍一下hash 对象处理的技巧。
*/
if _n_ = 1 then do;
declare hash newly(dataset:'id_newly');/*使用数据集id_newly定义hash对象*/
newly.definekey('id');/*其中定义id为主键*/
newly.definedata('epl_ym');/*定义epl_ym为信息变量*/
newly.definedone();/*结束hash对象的初始化*/
end;
set sales_all;
rc = newly.find(key:id);/*调用find方法检索数据集sales_all中的变量id的值是否出现在hash对象的主键中*/
if rc = 0;/*此处注意,find()找到匹配的值返回的是0,这个和其他语言不同。*/
run;
所得结果如下:
2.使用hash对象拼接数据
/*创建销售等级对应的佣金比例数据集*/
data grade;
input grade $ rate;
cards
;
a 0.20
b 0.18
c 0.15
d 0.10
e 0.05
;
run;
结果如下:
/*计算佣金*/
data csm_amt;
if _n_ = 0 then do;
set id_newly grade;
end;
else if _n_ = 1 then do;
declare hash newly(dataset:'id_newly');
newly.definekey('id');
newly.definedata('epl_ym');
newly.definedone();
declare hash grd(dataset:'grade');
grd.definekey('grade');
grd.definedata('rate');
grd.definedone();
end;
call missing (of _all_);
set sales_all;
rc1 = newly.find(key:id);
rc2 = grd.find(key:grade);
if rc1 = 0 then csm_amt = amt*rate;
run;
3.调用definedata 时使用all选项
/*小组信息*/
data team_info;
input team $ open_ym grade employees;
cards
;
a 201201 12 6
b 201202 11 9
c 201205 9 12
d 201506 7 20
e 201205 8 9
f 201206 10 23
;
run;
所得数据集如下:
data employ_new;
input id $ team $;
cards
;
2001 c
2036 d
;
run;
data newly_info;
if _n_ = 0 then do;
set team_info;
end;
else if _n_ = 1 then do;
declare hash t(dataset:'team_info');
t.definekey('team');
t.definedata(all:'yes');
t.definedone();
end;
call missing(of _all_ );
set employ_new;src = t.find();
run;
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
CDA 数据分析师报考条件详解与准备指南 在数据驱动决策的时代浪潮下,CDA 数据分析师认证愈发受到瞩目,成为众多有志投身数 ...
2025-07-18刚入职场或是在职场正面临岗位替代、技能更新、人机协作等焦虑的打工人,想要找到一条破解职场焦虑和升职瓶颈的系统化学习提升 ...
2025-07-182025被称为“AI元年”,而AI,与数据密不可分。网易公司创始人丁磊在《AI思维:从数据中创造价值的炼金术 ...
2025-07-18CDA 数据分析师:数据时代的价值挖掘者 在大数据席卷全球的今天,数据已成为企业核心竞争力的重要组成部分。从海量数据中提取有 ...
2025-07-18SPSS 赋值后数据不显示?原因排查与解决指南 在 SPSS( Statistical Package for the Social Sciences)数据分析过程中,变量 ...
2025-07-18在 DBeaver 中利用 MySQL 实现表数据同步操作指南 在数据库管理工作中,将一张表的数据同步到另一张表是常见需求,这有助于 ...
2025-07-18数据分析师的技能图谱:从数据到价值的桥梁 在数据驱动决策的时代,数据分析师如同 “数据翻译官”,将冰冷的数字转化为清晰的 ...
2025-07-17Pandas 写入指定行数据:数据精细化管理的核心技能 在数据处理的日常工作中,我们常常需要面对这样的场景:在庞大的数据集里精 ...
2025-07-17解码 CDA:数据时代的通行证 在数字化浪潮席卷全球的今天,当企业决策者盯着屏幕上跳动的数据曲线寻找增长密码,当科研人员在 ...
2025-07-17CDA 精益业务数据分析:数据驱动业务增长的实战方法论 在企业数字化转型的浪潮中,“数据分析” 已从 “加分项” 成为 “必修课 ...
2025-07-16MySQL 中 ADD KEY 与 ADD INDEX 详解:用法、差异与优化实践 在 MySQL 数据库表结构设计中,索引是提升查询性能的核心手段。无论 ...
2025-07-16解析 MySQL Update 语句中 “query end” 状态:含义、成因与优化指南 在 MySQL 数据库的日常运维与开发中,开发者和 DBA 常会 ...
2025-07-16如何考取数据分析师证书:以 CDA 为例 在数字化浪潮席卷各行各业的当下,数据分析师已然成为企业挖掘数据价值、驱动决策的 ...
2025-07-15CDA 精益业务数据分析:驱动企业高效决策的核心引擎 在数字经济时代,企业面临着前所未有的数据洪流,如何从海量数据中提取有 ...
2025-07-15MySQL 无外键关联表的 JOIN 实战:数据整合的灵活之道 在 MySQL 数据库的日常操作中,我们经常会遇到需要整合多张表数据的场景 ...
2025-07-15Python Pandas:数据科学的瑞士军刀 在数据驱动的时代,面对海量、复杂的数据,如何高效地进行处理、分析和挖掘成为关键。 ...
2025-07-15用 SQL 生成逆向回滚 SQL:数据操作的 “后悔药” 指南 在数据库操作中,误删数据、错改字段或误执行批量更新等问题时有发生。 ...
2025-07-14t检验与Wilcoxon检验的选择:何时用t.test,何时用wilcox.test? t 检验与 Wilcoxon 检验的选择:何时用 t.test,何时用 wilcox. ...
2025-07-14AI 浪潮下的生存与进阶: CDA数据分析师—开启新时代职业生涯的钥匙(深度研究报告、发展指导白皮书) 发布机构:CDA数据科 ...
2025-07-13LSTM 模型输入长度选择技巧:提升序列建模效能的关键 在循环神经网络(RNN)家族中,长短期记忆网络(LSTM)凭借其解决长序列 ...
2025-07-11