SAS中的哈希对象-是否可以使用哈希对象连接下面的两个表?
我正试图找到一种方法,尽可能用哈希替换所有可能的proc-sql和常规合并。 示例数据看起来像SAS中的哈希对象-是否可以使用哈希对象连接下面的两个表?,sas,concatenation,hashtable,Sas,Concatenation,Hashtable,我正试图找到一种方法,尽可能用哈希替换所有可能的proc-sql和常规合并。 示例数据看起来像 data TABLE1; input Date Property $6. Headcount; datalines; 01Jul2013 East 100 02Jul2013 East 50 02Jul2013 West 50 ; run; data TABLE2; input Date Property $6. Headcount; datalines; 11Aug2013 East 60
data TABLE1;
input Date Property $6. Headcount;
datalines;
01Jul2013 East 100
02Jul2013 East 50
02Jul2013 West 50
;
run;
data TABLE2;
input Date Property $6. Headcount;
datalines;
11Aug2013 East 60
02Oct2013 East 50
22Dec2013 West 40
run;
两个数据集都已按日期
和属性
排序。目前我通过
data WANT;
set TABLE1 TABLE2;
run;
但问题是两个表中的记录总数都相当大。上述代码需要20分钟甚至更长时间才能完成此连接
我知道如何使用hash对象来获得外部连接结果。但是如何将其用于此目的呢?您随后是否在其他步骤(数据或过程)中使用您的
WANT
datastep,例如对其进行汇总或细分
如果是这样,可以通过将WANT
指定为视图而不是表来减少I/O
data want /view=want ;
set table1 table2 ;
run ;
/* Then use `want` elsewhere... */
proc summary data=want ... ;
...
run ;
数据需要/视图=需要;
设置表1和表2;
跑
/*然后在其他地方使用'want'*/
proc summary data=want;
...
跑
但是。。。如果多次使用
want
,将其构建为一个表可能会更有效(在术语、时间或I/O方面)。在这种情况下,使用哈希对象不太可能提高性能。使用散列对象的主要好处是,它们允许您将一个或多个小数据集的值合并到一个较大的数据集上,而无需对大数据集进行排序。在这种情况下:
- 您的两个数据集都很大
- 你没有做任何合并
如果你真的感兴趣的话,可以通过使用散列迭代器进行追加,但我不想麻烦你。正如其他用户所建议的,在这里添加是一种方式,因为它将减少I/O需求。查看
proc append
的文档了解更多详细信息。对于哈希对象,哪一个应该是“基本”表,小的还是?您希望避免对大表进行排序,因为大表可能太大,无法放入可用内存,因此您将小表作为哈希对象加载到内存中。