
SAS—HASH對(duì)象的應(yīng)用
HASH table原理
先介紹下hash的原理吧。hash table其實(shí)就是散列表,也叫哈希表,根據(jù)關(guān)Key-value鍵值對(duì)而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。它通過(guò)把key-value映射到表中一個(gè)位置來(lái)訪問(wèn)記錄,不用掃描整張表以加快查找的速度。這個(gè)映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做哈希表。
在數(shù)據(jù)裝載時(shí),根據(jù)F(key)=內(nèi)存地址將表存到內(nèi)存中指定的地址。
比如我最愛(ài)的杰倫,根據(jù)散列函數(shù)F(周杰倫) = 18 就可找到對(duì)應(yīng)的value為87啦。
sas hash table 的優(yōu)點(diǎn)
hash table是 SAS 查找技術(shù)中最為常用的技術(shù)啦,性能表現(xiàn)經(jīng)評(píng)測(cè)也比較上乘,在SAS 產(chǎn)品中已被廣泛使用,同時(shí)也深受國(guó)外SAS程序員的喜愛(ài),但在國(guó)內(nèi)大家好像并不怎么常用。但是想想可以用sas hash提高下數(shù)據(jù)查詢的效率,是不是在小伙伴面前有些小逼格呢!?
下面呢就介紹下sas hash table的優(yōu)點(diǎn):
1.hash table 可以根據(jù) K-V 定位數(shù)據(jù),直接得到變量的存儲(chǔ)地址,可以減少查詢的次數(shù);
2.hash table的變量查找是在內(nèi)存中進(jìn)行的,可以提高性能;
3.hash table可以在data步運(yùn)行時(shí)的動(dòng)態(tài)地添加、更新、刪除等操作;
4.hash 可以做一些merge 和 proc sql 難以實(shí)現(xiàn)的數(shù)據(jù)集合并,并在細(xì)節(jié)上可以有更多的控制。
當(dāng)然,因?yàn)閟as hash是在內(nèi)存中運(yùn)行,所以如果數(shù)據(jù)太大,還是不要用hash對(duì)象了。
sas 定義hash對(duì)象
Hash對(duì)象的最基本的要點(diǎn)有三個(gè):
(1)要放入內(nèi)存中的表
(2)用來(lái)通過(guò)hash函數(shù)建立與內(nèi)存對(duì)應(yīng)存儲(chǔ)地址的KEY值(可以是數(shù)值、字符或者兩者的混合,最好是表的主鍵否則只有第一條記錄有效,因?yàn)閗ey值相同通過(guò)F(key)只會(huì)指向一個(gè)地址)。
(3)要調(diào)入內(nèi)存中與key值一起構(gòu)成數(shù)組的變量.
在SAS中分別通過(guò)以下步驟來(lái)完成上述三個(gè)要點(diǎn):
hash的使用實(shí)例
(1)通過(guò)hash可以實(shí)現(xiàn)表與表的高效關(guān)聯(lián)
(2)可以對(duì)hash表中的數(shù)據(jù)進(jìn)行控制設(shè)計(jì)巧妙的算法。下邊是一些具體的例子:
使用hash對(duì)象來(lái)篩選數(shù)據(jù)
/*新入職員工信息*/
data id_newly;
input id $ epl_ym;
cards
;
1101 201201
1102 201201
1123 201203
1105 201202
1104 201202
1105 201202
;
run;
如下圖所示:
/*創(chuàng)建每位員工的銷售級(jí)別及銷售額*/
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對(duì)象篩選新員工的銷售額*/
data sales_newly;
length id $8. epl_ym 8.;/*定義數(shù)據(jù)變量id、epl_ym類型和長(zhǎng)度,此處將變量類型和長(zhǎng)度寫(xiě)死在程序里,這樣當(dāng)查找表的數(shù)據(jù)結(jié)構(gòu)發(fā)生變化時(shí)還要重寫(xiě)代碼。以后會(huì)單獨(dú)介紹一下hash 對(duì)象處理的技巧。
*/
if _n_ = 1 then do;
declare hash newly(dataset:'id_newly');/*使用數(shù)據(jù)集id_newly定義hash對(duì)象*/
newly.definekey('id');/*其中定義id為主鍵*/
newly.definedata('epl_ym');/*定義epl_ym為信息變量*/
newly.definedone();/*結(jié)束hash對(duì)象的初始化*/
end;
set sales_all;
rc = newly.find(key:id);/*調(diào)用find方法檢索數(shù)據(jù)集sales_all中的變量id的值是否出現(xiàn)在hash對(duì)象的主鍵中*/
if rc = 0;/*此處注意,find()找到匹配的值返回的是0,這個(gè)和其他語(yǔ)言不同。*/
run;
所得結(jié)果如下:
2.使用hash對(duì)象拼接數(shù)據(jù)
/*創(chuàng)建銷售等級(jí)對(duì)應(yīng)的傭金比例數(shù)據(jù)集*/
data grade;
input grade $ rate;
cards
;
a 0.20
b 0.18
c 0.15
d 0.10
e 0.05
;
run;
結(jié)果如下:
/*計(jì)算傭金*/
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.調(diào)用definedata 時(shí)使用all選項(xiàng)
/*小組信息*/
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;
所得數(shù)據(jù)集如下:
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;
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實(shí)踐的落地者與價(jià)值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價(jià)值,最終要在 “實(shí)踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場(chǎng)景的分 ...
2025-09-10機(jī)器學(xué)習(xí)解決實(shí)際問(wèn)題的核心關(guān)鍵:從業(yè)務(wù)到落地的全流程解析 在人工智能技術(shù)落地的浪潮中,機(jī)器學(xué)習(xí)作為核心工具,已廣泛應(yīng)用于 ...
2025-09-09SPSS 編碼狀態(tài)區(qū)域中 Unicode 的功能與價(jià)值解析 在 SPSS(Statistical Product and Service Solutions,統(tǒng)計(jì)產(chǎn)品與服務(wù)解決方案 ...
2025-09-09