【问题标题】:SAS Viya 3.4 Manipulation of a table in memorySAS Viya 3.4 操作内存中的表
【发布时间】: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; 之前一样)所以,这只是一个好主意。检查下面的答案。这是一个解决方案!谢谢,

标签: sas in-memory


【解决方案1】:

最好为此使用 CAS 操作;但是,直到 Viya 3.5 才添加 table.deleteRows 操作。升级表最初的意思是基本上是不可变的:当一个表在 CAS 中为每个人启动并升级时,通常应该只附加好的数据。当然,不良数据有时会进入生产系统,需要对其进行修改。

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

在执行此操作之前,请仔细检查它是否以特定方式分区或排序。您可以将分区和顺序语句添加到数据集选项中。如果需要将表保存到持久化存储,也可以使用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;

【讨论】:

  • 我似乎可以接受。真的很有帮助。但我还有一个问题?如果我在同一个 caslib 上实现这个有什么问题吗? data caslib.mytable2; set caslib.mytable; where date &lt; '06FEB2021'd; run; proc casutil; droptable casdata="mytable" incaslib="caslib" ; promote casdata="mytable2" incaslib="casuser" outcaslib="caslib" casout="mytable"; run;
  • 没有问题。 Viya 中的 CASLIB 基本上就像逻辑上分离的文件夹。最后一切都在记忆中。我只是喜欢使用 CASUSER,因为它就像 WORK 目录的 CAS 等价物。
  • 您好,当我尝试使用上述 SAS 代码时,我收到此错误“超过了在同一会话中同时存在多个云分析服务表时可以读取的最大行数”。有什么想法吗?
  • 我之前没有收到这个错误。我会打电话给 SAS 技术支持或在 Viya 部分发布 SAS 社区。可能有一个选项来控制它。
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2012-08-09
  • 2021-12-23
相关资源
最近更新 更多