首页 > 解决方案 > 如何在 SAS 中重用哈希表

问题描述

我有许多 large_tables(数十亿行),我想根据 id_list(数百万行)对其进行子集化。我正在使用哈希表来加速它:

data subset1;
    set large_table1;
    if _n_ eq 1 then do;
        declare hash ht(dataset:"id_list");
        ht.definekey('id');
        ht.definedone();
    end;
    if ht.check() eq 0 then do; output; end;
run;

如何重用 id_list 的哈希表?在每个子集查询中重新创建它会浪费太多时间。

更新:如答案所示,目前没有在 SAS 中制作持久哈希表的解决方法。我用 1200 万行 id_list 和 15 亿行 large_table 凭经验测试了两个不太理想的选项。使用格式而不是哈希表几乎花费了两倍的时间(40 分钟对 23 分钟)。这使得在每个数据步骤中重新创建哈希表的开销可以忽略不计,因此我暂时只是这样做。

标签: sas

解决方案


遗憾的是,哈希表不能跨 DATA 步持续存在。AFAIK,当步骤结束时,它们被擦除以释放内存。我在 SGF 2018 上看到了 Art Carpenter 的演讲,他尝试了不同的方法来欺骗 SAS 制作持久哈希表,但未能成功。

https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2018/2399-2018.pdf


推荐阅读