SAS Viya 3.4 在内存中操作 table

SAS Viya 3.4 Manipulation of a table in memory

我将通过下面的示例给出我想要实现的内容。 在此之后,我会给你我的两个方法。 我正在使用 3.4 SAS Viya 平台。

示例: 我有一个 table (MYTABLE),这个 table 在全局 caslib (CKCAS) 上被提升。 此 table 包含 10 行和 5 列。

我的表

column1 column2 column3 column4 date
aaa 4567 gtt 44 20210201
aa 5535 faas 44 20210202
fd 23 axv 44 20210203
sd 736 azxq 44 20210204
ghy 9008 feet 44 20210205
lk 3339 wqopp 44 20210206
yj 112 poo 44 20210207
trr 3634 piuy 44 20210208
hrfthr 689 iuyt 44 20210209
rt 2345 uio 44 20210210

客户要求我从 table 中删除几行。 他的目标是保留最近的(按列 'date')5 天。 下面是“想要的”table:

column1 column2 column3 column4 date
lk 339 wqopp 44 20210206
yj 112 poo 44 20210207
try 3634 piuy 44 20210208
hrfthr 689 iuyt 44 20210209
rt 2345 uio 44 20210210

重要! table 需要在所有会话中进行推广和访问! 现在,每天都有一个工作,为客户端收集数据并将它们附加到 MYTABLE 上。 此实现不会更改!

方法 1

cas christos;
libname KAPPA cas caslib="CKCAS";
 
proc sql;
delete from KAPPA.MYTABLE
where date<20210206;
quit;
cas christos terminate;

如果我执行下面的代码,我会达到目标table吗? table MYTABLE 删除行后是否会提升?

方法 1 结束

方法 2 我想到的第二种方法是将内存的 table 保存到服务器的硬盘驱动器。 在那里进行删除,然后在内存中再次提升 table 。 使用代码:

cas christos;
caslib _all_ assign;
casdatalimit=ALL;
libname pathtohd '/tmp/tempo_directory/';
libname KAPPA cas caslib="CKCAS";

data pathtohd.MYTABLE;
set KAPPA.MYTABLE;
run;

proc sql;
delete from pathtohd.MYTABLE
where date<20210206;
quit;
 
proc casutil;
load data=pathtohd.MYTABLE casout="MYTABLE" outcaslib="CKCAS" replace promote;
run;

cas christos terminate;

方法 2 结束

我客户的 table 包含数亿行,最重要的是 table 在生产环境中。 我认为这个实现需要在内存中。 你有更好的主意吗? 我的任何方法都有效吗? **此实施需要超过 100 tables + 这些 tables 每天从 SAS 作业更新。 所以,我的第二种方法似乎不是最合适的。

提前致谢

最好使用 CAS 操作;但是,直到 Viya 3.5 才添加 table.deleteRows 操作。 Promoted tables 最初意味着基本上是 immutable:当一个 table 启动并在 CAS 中为每个人提升时,通常只应附加良好的数据。当然,坏数据有时会进入生产系统,需要修改。

由于您需要删除行,最安全的方法是在 CASUSER 中创建它的副本,删除旧的 table,然后提升更新的。他们的 CAS 集群可能有足够的内存来执行此操作。

在执行此操作之前,请仔细检查它是否以特定方式分区或排序。您可以将分区和排序语句添加到数据集选项中。如果您需要将 table 保存到持久存储,请在 proc casutil 中也使用 save 语句。

使用此方法,所有更改仅在 CAS 中完成。

data causer.mytable;
    set caslib.mytable;
    where date < '06FEB2021'd;
run;

proc casutil;
    droptable casdata="mytable" incaslib="caslib" outcaslib="caslib";
    promote casdata="mytable" incaslib="casuser" outcaslib="caslib";
run;