我有一个非常大的数据集,大小为1T,我需要将其迅速分成几个子数据集。
以下是拆分数据集的传统方法:
Data d1 d2...dn;
Set raw_dataset;
if condition1 then output d1;
else if condition2 then output d2;
...
else if conditionN then output dn;
run;
但是对我来说还是太慢了!
有什么方法可以加快这一过程?
答案 0 :(得分:0)
您可以使用以下宏,只需输入两个参数 1.要拆分的输入数据集 2.在每个数据集中输入所需的最大观测值
options merror mprint symbolgen mlogic;
/****CHANGE PATH for input DS location****/
libname inp "Y:\InputDS";
libname outp "Y:\OutputDS";
data inp_ds;
set inp.input_sample; /****CHANGE Input DS****/
run;
proc sql noprint;
select count(*) into: total_obs from inp_ds;
quit;
%let max_obs=20000; /****CHANGE max number of OBS in a split DS****/
%let split_ds_num_temp=%sysfunc(int(&total_obs/&max_obs));
%let remainder= %sysfunc(mod(&total_obs,&max_obs));
data find_num;
if &remainder>0 then split_ds_num=&split_ds_num_temp+1;
else split_ds_num=&split_ds_num_temp;
call symput('no_of_splits',split_ds_num);
run;
%macro split(i,inds);
data outp.out&i;
set &inds;
%if &i=1 %then
%do;
If _N_>=1 and _N_<=&max_obs Then Output;
%end;
%else %if &i>1 %then
%do;
If _N_ >=(&max_obs*(&i-1))+1 and _N_<=&max_obs*&i Then Output;
%end;
run;
%mend split;
data initiate_macro;
do i = 1 to &no_of_splits;
call execute('%split('||i||', inp_ds)');
end;
run;
这将创建多个输出数据集,如:out1 out2 ... outn ..取决于程序中提到的输出目录路径中的观察值
答案 1 :(得分:0)
如果您不想使用条件,我可以与您分享我3年以来一直使用的宏:
%macro partitionner(Library=, Table=, nb_part=, nblig=, tabIntr=);
data
%do i=1 %to &nb_part;
&Library..&tabIntr.&i.
%end;
;
set &Library..&Table.;
%do i=1 %to %eval(&nb_part-1);
if _n_ >= %eval(1+(&i.-1)*&nblig.) and _n_ <= %eval(&i.*&nblig.)
then output &Library..&tabIntr.&i.;
%end;
if _n_>=%eval((&i.-1)*&nblig+1) then output &lib..&tabIntr.&nb_part.;
run;
%mend partitionner;
其中:
示例:
bigTable有100行,它在LIBRA库中。想要将其拆分为4个表,每个表有33行。
%partitionner(Library=LIBRA, Table=bigTable, nb_part=4, nblig=33, tabIntr=smalTable);
结果是: