运行 与 SAS Enterprise Guide 并行的事情
Running Things in Parallel with SAS Enterprise Guide
各位Stack Overflow的各位大神们下午好。我对 SAS Enterprise Guide 7.1 中并行的 运行ning 代码有疑问。
目前,我在一个项目中有 5 个小的 PROC SQL 运行ning。代码 运行 没问题,但它是按顺序执行的(即:一次一个),即使我在一个单独的部分中分解了每一部分,我似乎也无法将所有 5 到 运行 一次。例如,下面的代码:
PROC SQL;
connect to Oracle (user = "&Oracle_ID." password = "&Oracle_PW." path = "&Oracle_Path.");
Create table place.base_balance_data as select * from connection to Oracle (
Select
DEBR.Acct_Ref_Id
,case when DEBR.Acct_Typ_Cd = '2' and DEBR.Settle_Dt_Bal_Amt > 0
then sum(settle_dt_bal_amt)
else sum(0)
end as Typ_2_Settle_Dt_Bal_Amt
,case when DEBR.Acct_Typ_Cd = '5' and DEBR.Settle_Dt_Bal_Amt > 0
then sum(settle_dt_bal_amt)
else sum(0)
end as Typ_5_Settle_Dt_Bal_Amt
,case when DEBR.Acct_Typ_Cd = '1' and DEBR.Settle_Dt_Bal_Amt < 0
then sum(settle_dt_bal_amt)
else sum(0)
end as Typ_1_Settle_Dt_Bal_Amt
,case when DEBR.Acct_Typ_Cd = '1' and DEBR.Settle_Dt_Bal_Amt < 0
then sum(Csh_Free_Cr_Amt)
else sum(0)
end as Csh_Free_Cr_Amt
,case when DEBR.Acct_Typ_Cd = '1' and DEBR.Settle_Dt_Bal_Amt < 0
then coalesce(DEBR.Cr_Avbl_Amt,0)
end as Credit_Aval_Amt
From Cool.DataStuff DEBR
Where DEBR.Date_ID = &lm_bus_dID.
Group by DEBR.Acct_Ref_Id, DEBR.Acct_Typ_Cd, DEBR.Cr_Avbl_Amt, DEBR.Settle_Dt_Bal_Amt
Order by DEBR.Acct_Ref_ID asc offset 0 rows
);
Disconnect from Oracle;
目前EG项目是这样的:
我正在拼命地尝试同时将 运行 右侧的所有 5 个部分都放在一起,但是,唉,每次我尝试这样做时,我都会遇到涉及宏传递的错误变量并且无法连接到多个会话。
有没有人以前有过这样的运气?你能告诉我我在这里遗漏了什么吗?
谢谢!
如果您安装了 SAS/CONNECT,您可以将所有内容分解为 rsubmit
个块,这些块将全部 运行 并行。您可以使用 %syslput
确保每个会话都获得所需的宏变量。
当 运行ning 在 rsubmit
块中时,将每个块视为其自己唯一、独立的工作会话,即 运行ning 代码 - 几乎就像一个线程。这个工人生活在自己的世界里,只知道它的会话中有什么。启动工人会话的主会话可以在工人执行其特定任务时自由地做任何它想做的事情。
下面是如何设置的示例。
设置码
这将处理在新会话中自动登录到元数据服务器并使所有代码 运行 异步。
options autosignon=yes
sascmd='!sascmd'
connectwait=no
;
创建宏变量并将它们传递给您的工作会话
这将做两件事:
- 开始新的异步会话
- 将您的宏变量从您的主会话发送到您的工作会话
..
<code to create macro vars>;
/* Send macro variables over to a new remote session */
%syslput mymacrovar / remote=worker1;
...
如果需要,可以使用%syslput _USER_ / remote=worker1
将所有用户自定义的宏变量发送到新会话。
将所有工作代码包含在 rsubmit 块中
libname workmain "%sysfunc(getoption(work))";
rsubmit remote=worker1 inheritlib=(<my libraries here> workmain);
<code here>;
endrsubmit;
注意 libname 语句,workmain
。 rsubmit
无法继承主会话的 work
库。这是设计使然,因为这些会话中的每一个都有自己的 work
库,其名称无法被覆盖。您可以通过创建一个指向主会话的 work
库的新库来解决这个问题。
等待一切完成
最后,您可以添加最后一段代码以等待一切完成 - 或者,您可以自由地让主线程 运行 更多独立的轻任务。
waitfor _ALL_
;
各位Stack Overflow的各位大神们下午好。我对 SAS Enterprise Guide 7.1 中并行的 运行ning 代码有疑问。
目前,我在一个项目中有 5 个小的 PROC SQL 运行ning。代码 运行 没问题,但它是按顺序执行的(即:一次一个),即使我在一个单独的部分中分解了每一部分,我似乎也无法将所有 5 到 运行 一次。例如,下面的代码:
PROC SQL;
connect to Oracle (user = "&Oracle_ID." password = "&Oracle_PW." path = "&Oracle_Path.");
Create table place.base_balance_data as select * from connection to Oracle (
Select
DEBR.Acct_Ref_Id
,case when DEBR.Acct_Typ_Cd = '2' and DEBR.Settle_Dt_Bal_Amt > 0
then sum(settle_dt_bal_amt)
else sum(0)
end as Typ_2_Settle_Dt_Bal_Amt
,case when DEBR.Acct_Typ_Cd = '5' and DEBR.Settle_Dt_Bal_Amt > 0
then sum(settle_dt_bal_amt)
else sum(0)
end as Typ_5_Settle_Dt_Bal_Amt
,case when DEBR.Acct_Typ_Cd = '1' and DEBR.Settle_Dt_Bal_Amt < 0
then sum(settle_dt_bal_amt)
else sum(0)
end as Typ_1_Settle_Dt_Bal_Amt
,case when DEBR.Acct_Typ_Cd = '1' and DEBR.Settle_Dt_Bal_Amt < 0
then sum(Csh_Free_Cr_Amt)
else sum(0)
end as Csh_Free_Cr_Amt
,case when DEBR.Acct_Typ_Cd = '1' and DEBR.Settle_Dt_Bal_Amt < 0
then coalesce(DEBR.Cr_Avbl_Amt,0)
end as Credit_Aval_Amt
From Cool.DataStuff DEBR
Where DEBR.Date_ID = &lm_bus_dID.
Group by DEBR.Acct_Ref_Id, DEBR.Acct_Typ_Cd, DEBR.Cr_Avbl_Amt, DEBR.Settle_Dt_Bal_Amt
Order by DEBR.Acct_Ref_ID asc offset 0 rows
);
Disconnect from Oracle;
目前EG项目是这样的:
我正在拼命地尝试同时将 运行 右侧的所有 5 个部分都放在一起,但是,唉,每次我尝试这样做时,我都会遇到涉及宏传递的错误变量并且无法连接到多个会话。
有没有人以前有过这样的运气?你能告诉我我在这里遗漏了什么吗?
谢谢!
如果您安装了 SAS/CONNECT,您可以将所有内容分解为 rsubmit
个块,这些块将全部 运行 并行。您可以使用 %syslput
确保每个会话都获得所需的宏变量。
当 运行ning 在 rsubmit
块中时,将每个块视为其自己唯一、独立的工作会话,即 运行ning 代码 - 几乎就像一个线程。这个工人生活在自己的世界里,只知道它的会话中有什么。启动工人会话的主会话可以在工人执行其特定任务时自由地做任何它想做的事情。
下面是如何设置的示例。
设置码
这将处理在新会话中自动登录到元数据服务器并使所有代码 运行 异步。
options autosignon=yes
sascmd='!sascmd'
connectwait=no
;
创建宏变量并将它们传递给您的工作会话
这将做两件事:
- 开始新的异步会话
- 将您的宏变量从您的主会话发送到您的工作会话
..
<code to create macro vars>;
/* Send macro variables over to a new remote session */
%syslput mymacrovar / remote=worker1;
...
如果需要,可以使用%syslput _USER_ / remote=worker1
将所有用户自定义的宏变量发送到新会话。
将所有工作代码包含在 rsubmit 块中
libname workmain "%sysfunc(getoption(work))";
rsubmit remote=worker1 inheritlib=(<my libraries here> workmain);
<code here>;
endrsubmit;
注意 libname 语句,workmain
。 rsubmit
无法继承主会话的 work
库。这是设计使然,因为这些会话中的每一个都有自己的 work
库,其名称无法被覆盖。您可以通过创建一个指向主会话的 work
库的新库来解决这个问题。
等待一切完成
最后,您可以添加最后一段代码以等待一切完成 - 或者,您可以自由地让主线程 运行 更多独立的轻任务。
waitfor _ALL_
;