将SAS Merge代码转换为PySpark SQL等价写法的技术咨询
SAS转PySpark SQL分析与实现
问题解答
1. 条件对应的SQL连接逻辑
if in1 and in2:完全对应内连接(INNER JOIN),只保留input_1和input_2中能通过col_1/col_2匹配上的行,输出到data3。else if in1:其实不是左连接(LEFT JOIN),而是左连接后的筛选结果——它只取input_1里**没匹配到input_2**的行,输出到data2。左连接会包含input_1的所有行(包括匹配到input_2的),但这里只保留左表独有的部分。
2. Merge语句中表的顺序问题
input_2和input_1的顺序不影响in=in1/in=in2的标记逻辑,因为in=是直接绑定到指定表的,和merge时的位置无关。不管谁在前,in1永远标记来自input_1的行,in2永远标记来自input_2的行。input_2不等价于左连接的左表:你这里else if in1对应的逻辑,是把input_1作为左表,左连接input_2后筛选掉右表有匹配的行,左表是input_1而非input_2。
对应的PySpark SQL代码
创建data3(内连接结果)
CREATE TABLE data3 AS SELECT i1.*, i2.*, 'yes' AS new_col FROM input_1 i1 INNER JOIN input_2 i2 ON i1.col_1 = i2.col_1 AND i1.col_2 = i2.col_2;
创建data2(input_1独有的行)
常规写法:
CREATE TABLE data2 AS SELECT i1.* FROM input_1 i1 LEFT JOIN input_2 i2 ON i1.col_1 = i2.col_1 AND i1.col_2 = i2.col_2 WHERE i2.col_1 IS NULL;
更高效的反连接写法:
CREATE TABLE data2 AS SELECT * FROM input_1 ANTI JOIN input_2 ON input_1.col_1 = input_2.col_1 AND input_1.col_2 = input_2.col_2;
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

