将SQL连接查询转换为pyspark语法

时间:2018-03-31 15:34:19

标签: pyspark pyspark-sql

我正在努力将已知的工作SQL查询转换为在pyspark中工作,给定两个数据帧,使用以下方法:.wherefilterr.id等。

以下是有效的SQL查询示例(仅选择# "invalid" records, where there is a matching `record_id` for rv_df SELECT DISTINCT(r.id) FROM core_record AS r LEFT OUTER JOIN core_recordvalidation rv ON r.id = rv.record_id WHERE r.job_id = 41 AND rv.record_id is not null; # "valid" records, where there is no matching `record_id` for rv_df SELECT DISTINCT(r.id) FROM core_record AS r LEFT OUTER JOIN core_recordvalidation rv ON r.id = rv.record_id WHERE r.job_id = 41 AND rv.record_id is not null; ,我通常会选择更多列):

r_df

我80/20接近,但在最后几步绕过我的脑袋,和/或如何最有效地做到这一点。

我有一个包含id列的数据框rv_df,我想在列record_id上加入Dataframe r.id。作为输出,我只想要不同 r_df,只有来自rv_df的列,而不是来自r_df.id的列。最后,我想要两个不同的电话,其中 匹配(对我来说将是“无效”记录),以及匹配的地方(我考虑“有效”记录。)

我有一些pyspark查询已经接近,但不是非常清楚如何确保r_df是不同的,并且只选择来自rv_df的列,而不是$result =array_merge($array[44259],$array[50007] ,$array[50009] , $array[46372], $array[46421] ); 中的列。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

只需走开几个小时。找到适用于我的用例的解决方案。

首先,从record_id中选择不同的rv_df

rv_df = rv_df.select('record_id').distinct()

然后将其用于交叉和脱离:

# Intersection:
j_df = r_df.join(rv_df, r_df.id == rv_df.record_id, 'leftsemi').select(r_df['*'])

# Disjoint:
j_df = r_df.join(rv_df, r_df.id == rv_df.record_id, 'leftanit').select(r_df['*'])