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;
我将通过下面的示例给出我想要实现的内容。 在此之后,我会给你我的两个方法。 我正在使用 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;