2017-12-22 3 views
0

두 개의 키를 기반으로 합치려는 두 개의 데이터 프레임이 있습니다. 일치 항목이없는 경우 키 1만을 기준으로 일치 항목을 가져 오려고합니다 (키 1의 여러 레코드가있을 수 있지만 하나를 선택할 수 있지만 레코드 하나만 가져와야합니다)스파크 2 단계 참여

:

val df1 = spark.sparkContext.parallelize(List(("k0","k00","v0"), 
    ("k1","k11","v1"),("k2","k22","v2")) 
    ).toDF("key1","key2","val_type_a") 

    val df2 = spark.sparkContext.parallelize(List(("k0","k00","X"), 
    ("k1","XX","Y"),("k1","YY","Z"),("k2","ZZ","W")) 
    ).toDF("key1","key2","val_type_b") 



    val df1_df2=df1.join(df2,Seq("key1","key2"),"left") 
    df1.show 
    df1_df2.show 

Res

그러나 K1에 대한 및 K2 행, 나는 또한에 따라 부분적으로 일치하기 때문에 인구 val_type_b 원하는 단지 키 하나입니다-사용할 수 K1, 그것은 Y 또는 Z와 k2가 될 수있다 그것은 W입니다. 가장 효율적인 방법은 무엇입니까?

답변

1

2 개의 조인으로 할 수 있습니다. 먼저 2 개의 조인을 조인 한 다음 나머지 1 개의 조인을 조인합니다.

작업을 완료 한 후 주먹은합니다 (먼저 작동하지 않았다 조인 경우)

var df2_single = df2.groupby("key1).agg(first("val_type_b").alias("val_type_b")) 

이 누락 된 값을 선택합니다 (첫 번째) 하나 개의 값을 유지하기 위해 DF2에 처음 GROUPBY +를 사용할 수 있습니다 가입 :

var missing = df1_df2.filter(col("val_types_b").isNull).drop("val_types_2") 

은 당신의 왼쪽 다시 가입 않습니다

var df1_df2_missing = missing.join(df2_single, "key1", "left") 

그리고 노동 조합 첫째 JOI의 결과를 n 및 두 번째 가입 :

df1_df2 = df1_df2.filter(col("val_types_b").isNotNull).union(df1_df2_missing)