복붙노트

[SCALA] 어떻게 두 DataFrames 사이의 대칭 차이를 구하는 방법?

SCALA

어떻게 두 DataFrames 사이의 대칭 차이를 구하는 방법?

SparkSQL 1.6 API (스칼라)에서 Dataframe가 교차하고 제외시켰다위한 기능을 가지고 있지만, 차이가없는 하나. 물론, 노동 조합과를 제외하고 조합은 차이를 생성하는 데 사용할 수 있습니다 :

df1.except(df2).union(df2.except(df1))

그러나 이것은 조금 어색한 것 같다. 뭔가 어색한 것 같으면 내 경험에 의하면, 특히 스칼라에, 그것을 할 수있는 더 좋은 방법이있다.

해결법

  1. ==============================

    1.당신은 항상 그것을로 다시 작성할 수 있습니다 :

    당신은 항상 그것을로 다시 작성할 수 있습니다 :

    df1.unionAll(df2).except(df1.intersect(df2))
    

    진심이 UNION, INTERSECT 불구하고 EXCEPT / MINUS 꽤 많이 SQL 결합 사업자의 표준 세트입니다. 나는 상자의 작업 밖으로처럼 XOR을 제공하는 시스템을 인식하지입니다. 대부분의 경우는 다른 세 가지를 사용하여 쉽게 구현할 수 있기 때문에 거기에 최적화에 많은 없다.

  2. ==============================

    2.왜 안 아래?

    왜 안 아래?

    df1.except(df2)
    
  3. ==============================

    3.드 DUPS 결과 (제외 단지의 별칭 또는 MINUS)을 제외하고 알 수 있습니다. 그래서 당신은 원래 dataframe 동일하게 설정 "교 차"+ 세트 (은 diff는 당신이 언급 한) "를 제외하고"예상되는 경우, 중복을 유지이 기능 ​​요구 사항을 고려하십시오

    드 DUPS 결과 (제외 단지의 별칭 또는 MINUS)을 제외하고 알 수 있습니다. 그래서 당신은 원래 dataframe 동일하게 설정 "교 차"+ 세트 (은 diff는 당신이 언급 한) "를 제외하고"예상되는 경우, 중복을 유지이 기능 ​​요구 사항을 고려하십시오

    https://issues.apache.org/jira/browse/SPARK-21274

    내가 거기에 쓴대로,로 스파크 SQL 재 작성 될 수있다 "ALL EXCEPT"

    SELECT a,b,c
    FROM    tab1 t1
         LEFT OUTER JOIN 
            tab2 t2
         ON (
            (t1.a, t1.b, t1.c) = (t2.a, t2.b, t2.c)
         )
    WHERE
        COALESCE(t2.a, t2.b, t2.c) IS NULL
    
  4. ==============================

    4.당신이 Pyspark 솔루션을 찾고 있다면, 당신은 빼기 () 문서를 사용해야합니다.

    당신이 Pyspark 솔루션을 찾고 있다면, 당신은 빼기 () 문서를 사용해야합니다.

    또한, unionAll 2.0에서 사용되지 않는, 사용 조합 () 대신한다.

    df1.union (DF2) .subtract (df1.intersect (DF2))

  5. ==============================

    5.나는 그것이 널 (null)을 필터링 한 후 가입 왼쪽을 사용하여보다 효율적으로 될 수있다 생각합니다.

    나는 그것이 널 (null)을 필터링 한 후 가입 왼쪽을 사용하여보다 효율적으로 될 수있다 생각합니다.

    df1.join(df2, Seq("some_join_key", "some_other_join_key"),"left")
    .where(col("column_just_present_in_df2").isNull)
    
  6. from https://stackoverflow.com/questions/36199901/how-to-obtain-the-symmetric-difference-between-two-dataframes by cc-by-sa and MIT license