【发布时间】:2021-02-26 21:52:36
【问题描述】:
我将通过下面的示例给出我想要实现的内容。 在此之后,我会给你我的两个方法。 我正在开发 3.4 SAS Viya 平台。
示例: 我有一个表(MYTABLE),这个表是在全局 caslib(CKCAS)上提升的。 此表包含 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 |
客户要求我从表中删除几行。 他的目标是保留最新的(按“日期”列)5 天。 下面是“想要的”表:
| 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 |
重要!该表需要从所有会话中升级和访问! 现在,每天都有一项工作为客户收集数据并将它们附加到 MYTABLE 上。 这个实现不会改变!
方法 1
cas christos;
libname KAPPA cas caslib="CKCAS";
proc sql;
delete from KAPPA.MYTABLE
where date<20210206;
quit;
cas christos terminate;
如果我执行下面的代码,我会达到目标表吗? 删除行后会提升表 MYTABLE 吗?
方法 1 结束
方法 2 我认为的第二种方法是将内存表保存到服务器的硬盘驱动器。 在那里进行删除,然后在内存中再次提升表。 附代码:
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;
APPROCHE 2 结束
我客户的表包含数亿行,最重要的是这些表位于生产环境中。 我认为这个实现需要在内存中。 你有更好的主意吗? 我的任何方法都有效吗? **此实施需要在 100 多个表上 + 这些表每天从 SAS 作业更新。 所以,我的第二种方法似乎不是最合适的。
提前问好
【问题讨论】:
-
嗯。我不是 Viya 用户,但我通常了解 Viya 的基础知识(相对于基本 SAS)。我认为您不需要将内容复制到硬盘上-在当今时代,我希望这不是真正的“硬盘”磁盘而是闪存? - 但无论如何,只是为了澄清一下,
data cas.yourdata; set cas.yourdata; where [condition]; run;不起作用吗?那个或 PROC SQL,DELETE 似乎是最好的尝试......当你这样做时会发生什么? -
例如可能想查看lexjansen.com/mwsug/2017/BB/MWSUG-2017-BB129-SAS.pdf。不谈删除,但很多类似的东西。
-
嗨,这是大家脑海中的第一个念头。但这是不正确的。上述方法将创建“期望的”结果,但会话明智。在平台上,您将能够看到更改。当您关闭 cas 会话时,提升的表将被取消连接(就像在您执行
data cas.yourdata; set cas.yourdata; where [condition]; run;之前一样)所以,这只是一个好主意。检查下面的答案。这是一个解决方案!谢谢,