Python 使用特定条件合并两个df以形成一个df
在spark python中,我必须合并两个具有相同列名和类型的数据帧: 合并数据帧时,存在以下几种情况:Python 使用特定条件合并两个df以形成一个df,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,在spark python中,我必须合并两个具有相同列名和类型的数据帧: 合并数据帧时,存在以下几种情况: 如果UPDATE\u TYPE为UPDATE,则忽略该行中除DISPOSITION和TIME以外的所有值。 对于处置,使用该行的处置值(更新类型为update)。 对于时间,使用两行中更大的时间值 如果UPDATE\u TYPE不是UPDATE则保留表2中除时间以外的所有值。对于时间,使用更大的时间价值 我已经做了,但使用了reducebykey。这是一个非常缓慢的解决方案。我可以直接
UPDATE\u TYPE
为UPDATE,则忽略该行中除DISPOSITION
和TIME
以外的所有值。
对于处置,使用该行的处置值(更新类型为update)。
对于时间,使用两行中更大的时间值
UPDATE\u TYPE
不是UPDATE
则保留表2中除时间以外的所有值。对于时间,使用更大的时间价值
df1
ID UPDATE_TYPE TIME DISPOSITION ROG
1 SEGMENT 1000 null Q
2 SEGMENT 1001 value W
3 SEGMENT 1002 null E
3 UPDATE 1004 some_value A
4 SEGMENT 1003 null R
5 SEGMENT 1004 value_old T
7 SEGMENT 1050 value U
df2
ID UPDATE_TYPE TIME DISPOSITION ROG
4 SEGMENT 1003 value P1
5 UPDATE 1015 value_new P2
6 SEGMENT 1010 value P3
编辑
事实证明,重复的ID可以存在于表1中。这些重复ID不得出现在最终输出中您可以尝试spark sql:
SELECT
DF1.ID,
DF1.UPDATE_TYPE,
CASE WHEN DF1.TIME > DF2.TIME THEN DF1.TIME ELSE DF2.TIME END AS TIME,
CASE WHEN DF2.UPDATE_TYPE='SEGMENT' THEN DF1.DISPOSITION ELSE DF2.DISPOSITION END AS DISPOSITION,
CASE WHEN DF2.UPDATE_TYPE='SEGMENT' THEN DF2.ROG ELSE DF1.ROG END AS ROG
FROM
DF1 LEFT JOIN DF2 ON DF1.ID = DF2.ID
使用
df1.join(df2,Seq(“ID”),“left”).select()
Hi@chlebek,我忘了提到我需要两个表中的数据。所以可能是完全的外部连接,但其余的事情会保持不变吗?我已经更新了一点场景。上面提到的所有条件都可能存在于表1 itslef中。要实现这一点,您可以尝试将df1与其自身交叉连接,并在select:select distinct。。。从DF1交叉连接DF1…
,但我没有测试它是否有效
SELECT
DF1.ID,
DF1.UPDATE_TYPE,
CASE WHEN DF1.TIME > DF2.TIME THEN DF1.TIME ELSE DF2.TIME END AS TIME,
CASE WHEN DF2.UPDATE_TYPE='SEGMENT' THEN DF1.DISPOSITION ELSE DF2.DISPOSITION END AS DISPOSITION,
CASE WHEN DF2.UPDATE_TYPE='SEGMENT' THEN DF2.ROG ELSE DF1.ROG END AS ROG
FROM
DF1 LEFT JOIN DF2 ON DF1.ID = DF2.ID