在 SAS 中加入两个数据集的替代方法
Alternative way of joining two datasets in SAS
我有两个数据集 DS1
和 DS2
。 DS1
是 100,000 行 x 40 列,DS2
是 20,000 行 x 20 列。如果某些字段匹配 DS2
,我实际上需要从 DS1
中提取 COL1
。
由于我对 SAS 非常陌生,所以我试图坚持 SQL 逻辑。
所以基本上我做了(拍摄版)
proc sql;
...
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
on DS1.COL2=DS2.COL3
OR DS1.COL3=DS2.COL3
OR DS1.COL4=DS2.COL2
...
大约一个小时后,它仍然是 运行,但我收到 SAS 的电子邮件,说我正在使用 700gb 左右。是否有更好更快的 SAS 方式来执行此操作?
我会使用 3 个单独的查询并使用 UNION
proc sql;
...
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
on DS1.COL2=DS2.COL3
UNION
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
On DS1.COL3=DS2.COL3
UNION
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
ON DS1.COL4=DS2.COL2
...
您加入的列中可能有空值或空值。您的查询可能会将所有 null/blank 列匹配在一起,从而产生非常大的结果集。
我建议添加额外的子句以排除空结果。
此外 - 如果同一行恰好存在于两个表中,那么您还应该防止该行连接到自身。
其中任何一个都可以有效地导致笛卡尔积连接(或接近笛卡尔积连接的东西)。
编辑: 顺便说一句 - 调试此类问题的一个好方法是将两个数据集限制在一定数量的行 - 比如每个 100 - 然后 运行 它并检查输出以确保它是预期的。您可以使用 SQL 选项 inobs=
、outobs=
和 loops=
来执行此操作。 Here's a link to the documentation.
首先使用过程排序对您尝试合并的数据集进行排序。然后根据id合并数据集。
以下是您的操作方法。
我假设您将字段匹配为 ID
proc sort data=DS1;
by ID;
proc sort data=DS2;
by ID;
data out;
merge DS1 DS2;
by ID;
run;
您可以对 Ds3 和 DS4 使用 proc 排序,然后如果您还需要加入它们,则将它们包含在合并语句中。
我有两个数据集 DS1
和 DS2
。 DS1
是 100,000 行 x 40 列,DS2
是 20,000 行 x 20 列。如果某些字段匹配 DS2
,我实际上需要从 DS1
中提取 COL1
。
由于我对 SAS 非常陌生,所以我试图坚持 SQL 逻辑。
所以基本上我做了(拍摄版)
proc sql;
...
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
on DS1.COL2=DS2.COL3
OR DS1.COL3=DS2.COL3
OR DS1.COL4=DS2.COL2
...
大约一个小时后,它仍然是 运行,但我收到 SAS 的电子邮件,说我正在使用 700gb 左右。是否有更好更快的 SAS 方式来执行此操作?
我会使用 3 个单独的查询并使用 UNION
proc sql;
...
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
on DS1.COL2=DS2.COL3
UNION
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
On DS1.COL3=DS2.COL3
UNION
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
ON DS1.COL4=DS2.COL2
...
您加入的列中可能有空值或空值。您的查询可能会将所有 null/blank 列匹配在一起,从而产生非常大的结果集。
我建议添加额外的子句以排除空结果。
此外 - 如果同一行恰好存在于两个表中,那么您还应该防止该行连接到自身。
其中任何一个都可以有效地导致笛卡尔积连接(或接近笛卡尔积连接的东西)。
编辑: 顺便说一句 - 调试此类问题的一个好方法是将两个数据集限制在一定数量的行 - 比如每个 100 - 然后 运行 它并检查输出以确保它是预期的。您可以使用 SQL 选项 inobs=
、outobs=
和 loops=
来执行此操作。 Here's a link to the documentation.
首先使用过程排序对您尝试合并的数据集进行排序。然后根据id合并数据集。
以下是您的操作方法。 我假设您将字段匹配为 ID
proc sort data=DS1;
by ID;
proc sort data=DS2;
by ID;
data out;
merge DS1 DS2;
by ID;
run;
您可以对 Ds3 和 DS4 使用 proc 排序,然后如果您还需要加入它们,则将它们包含在合并语句中。