有条件地在SAS中拆分庞大的数据集

时间:2017-11-27 22:13:57

标签: sas bigdata

我需要有关如何有效地分割数据集的建议(大约700万行和280列)。 我的数据集包含列'部门'和' classid'这不是唯一的。 我想根据部门变量和最大观察数量(100k)拆分我的数据集。以下示例显示了另一个限制:

Ex 1:

math_1 - 10k rows
math_2 - 80k rows
math_3 - 20k rows

Result 1:

math_1 + math_2 -> 90.000 rows - OK
math_3 -> 20.000 rows - OK

Ex. 2:

math_1 - 90k rows
math_2 - 80k rows
math_3 - 10k rows

Result 2.1:

math_1 + math_2 -> 100k rows (90k from math1, 10k from math2) -> not OK 
math_2 + math_3 -> 80k rows (70k from math_2, 10k from math_3 -> not OK

math_2分为两个表,虽然它可以合并为一个,所以它应该像这样拆分:

Result 2.2:

math_1 -> 90k rows -> OK
math_2 + math_3 -> 90k rows -> OK

即使math_2不适合一个表格,我也不希望它与其他原始表格中的行混合。

我试图用哈希表来解决它,但由于列数很大,我只是耗尽内存。

1 个答案:

答案 0 :(得分:1)

不确定哈希必须在这做什么。

我首先按部门和ClassID汇总数据。将计数放入表中。然后,您可以沿着表格创建一个名为group的新变量。如果总数> X金额然后组+ 1,否则组是相同的。这将创建一个告诉您文件结构的变量。

然后将这些数据集与组一起用于构建表拆分。我建议使用CALL EXECUTE或DOSUBL将数据拆分为子集。

最高为90K的700万将是8 +数据集....但是要理解你需要去哪里获取数据将是一场噩梦,因为它不是逻辑设计的。所以你总是需要引用这个表。

data have;
input department $ classID $ num_records;
cards;
A math1 500
A math2 500
A math3 200
A math4 100
;
run;

data groups;
set have;
retain running_total;
running_total=sum(running_total, num_records);
if running_total >= 500 then do; group+1; running_total=num_records;
end;
run;

如果确实非常需要,请使用上面的链接创建子集。