【发布时间】:2022-06-23 21:41:14
【问题描述】:
我正在将 SAS 代码转换为 Spark。在其中一个数据步骤中,SAS 正在进行合并。 我需要在 Spark 中实现相同的目标。请帮我完成这项工作。
SAS 代码:
proc sort data=dat1;by mbr_sys_id clm_aud_nbr2;run;
proc sort data=dat2;by mbr_sys_id clm_aud_nbr2;run;
data want;
merge dat1(in=a)
dat2(in=b);
by mbr_sys_id clm_aud_nbr2;
if a and b;
run;
火花代码:
val want=dat1.as("a").join(dat2.as("b"), dat1("mbr_sys_id")===dat2("mbr_sys_id") &&
dat1("clm_aud_nbr2")===dat2("clm_aud_nbr2"),"inner")
SAS 的输出: SAS output
Spark 的输出: Spark output
所以 SAS 只给出三行,但 spark 给出 6 行,我被告知将输出作为 SAS。
【问题讨论】:
-
Spark代码没有问题,结果符合预期。满足连接条件的 2 x 3 行。如果你不想这样,你可以先尝试右表的左连接
-
是的,我知道它给出了 2*3 但如何获得像 SAS 合并。
-
我不确定“合并”的概念在 SAS 中的作用。你能解释一下吗?这是什么语义?好的,我读过了。 SAS Merge 从第一个文件中获取一条记录,如果它们具有相同的列,则在第二个文件中匹配一条记录。加入从第一个文件中获取一条记录,如果它们具有相同的列,则与第二个文件中的所有记录匹配。
-
您是否尝试将
distinct()添加到数据框? -
SAS 合并就像join,但是当有many to many join 时,它是这样完成的。在 Dat1 中有 2 行,在 Dat2 中有 3 行。所以 Dat1 第一行与 dat2 第一行和第二行连接到 dat2 的第二行,下一个 dat2 有三行,现在 dat2 用完了所有行......现在 dat1 将继续提供它的数据集的最后一行,这最后一行将用于连接 dat2 中的其余行。
标签: apache-spark apache-spark-sql sas