Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用特定条件合并两个df以形成一个df_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 使用特定条件合并两个df以形成一个df

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。这是一个非常缓慢的解决方案。我可以直接

在spark python中,我必须合并两个具有相同列名和类型的数据帧: 合并数据帧时,存在以下几种情况:

  • 如果
    UPDATE\u TYPE
    为UPDATE,则忽略该行中除
    DISPOSITION
    TIME
    以外的所有值。 对于处置,使用该行的处置值(更新类型为update)。 对于时间,使用两行中更大的时间值

  • 如果
    UPDATE\u TYPE
    不是
    UPDATE
    则保留表2中除时间以外的所有值。对于时间,使用更大的时间价值

  • 我已经做了,但使用了reducebykey。这是一个非常缓慢的解决方案。我可以直接使用df并执行它吗

    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