我需要有关如何有效地分割数据集的建议(大约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
不适合一个表格,我也不希望它与其他原始表格中的行混合。
我试图用哈希表来解决它,但由于列数很大,我只是耗尽内存。
答案 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;
如果确实非常需要,请使用上面的链接创建子集。