如何尽快分割大型数据集

时间:2019-04-02 13:42:59

标签: sas

我有一个非常大的数据集,大小为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;

但是对我来说还是太慢了!
有什么方法可以加快这一过程?

2 个答案:

答案 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;

其中:

  • Library:要在其中拆分表的库名称, 结果。
  • Table:要拆分的表的名称。
  • nb_part:其中的表数是拆分的结果。
  • nblig:每个输出表中的行数。
  • tabIntr:输出的表的名称(前缀)。

示例:

bigTable有100行,它在LIBRA库中。想要将其拆分为4个表,每个表有33行。

%partitionner(Library=LIBRA, Table=bigTable, nb_part=4, nblig=33, tabIntr=smalTable);

结果是:

  • smalTable1有33个观测值。
  • smalTable2有33个观测值。
  • smalTable3有33个观测值。
  • smalTable4有1个观察结果。