2017-09-30 1 views
0

그래서 두 개의 데이터 프레임이 있습니다. 이런 데이터 프레임 1 :두 개의 데이터 프레임 결합 및 하나의 데이터 프레임 레코드를 다른 데이터로 업데이트

+----------+------+---------+--------+------+ 
|  OrgId|ItemId|segmentId|Sequence|Action| 
+----------+------+---------+--------+------+ 
|4295877341| 136|  4|  1| I|!|| 
|4295877346| 136|  4|  1| I|!|| 
|4295877341| 138|  2|  1| I|!|| 
|4295877341| 141|  4|  1| I|!|| 
|4295877341| 143|  2|  1| I|!|| 
|4295877341| 145|  14|  1| I|!|| 
| 123456789| 145|  14|  1| I|!|| 
| 809580109| 145|  9|  9| I|!|| 
+----------+------+---------+--------+------+ 

DataFrame2

+----------+------+-----------+----------+--------+ 
|  OrgId|ItemId|segmentId_1|Sequence_1|Action_1| 
+----------+------+-----------+----------+--------+ 
|4295877343| 149|   15|   2| I|!|| 
|4295877341| 136|  null|  null| I|!|| 
| 123456789| 145|   14|   1| D|!|| 
|4295877341| 138|   11|  22| I|!|| 
|4295877341| 141|   10|   1| I|!|| 
|4295877341| 143|   1|   1| I|!|| 
| 809580109| 145|  NULL|  NULL| I|!|| 
+----------+------+-----------+----------+--------+ 

가 이제 데이터 프레임 2의 레코드와 일치하는 두 데이터 프레임 업데이트 데이터 프레임 (1) 열 가입이 이하와 같다.

두 데이터 프레임의 키는 모두 OrgId 및 ItemId입니다.

따라서 예상되는 출력이 있어야합니다.

+----------+------+---------+--------+------+ 
|  OrgId|ItemId|segmentId|Sequence|Action| 
+----------+------+---------+--------+------+ 
|4295877346| 136|  4|  1| I|!|| 
|4295877341| 145|  14|  1| I|!|| 
|4295877343| 149|  15|  2| I|!|| 
|4295877341| 136|  null| null| I|!|| 
|4295877341| 138|  11|  22| I|!|| 
|4295877341| 141|  10|  1| I|!|| 
|4295877341| 143|  1|  1| I|!|| 
| 809580109| 145|  9|  9| I|!|| 
+----------+------+---------+--------+------+ 

그래서 데이터 프레임 1 레코드를 데이터 프레임 2 레코드로 업데이트해야합니다. 데이터 프레임 1의 레코드가 2에서 발견되지 않으면 해당 레코드를 보유해야합니다. 새로운 레코드가 출력 다음

에서 추가로 요구 사항을 기록 후 dataframe 2에서 발견되는 경우 는

val df3 = df1.join(df2, Seq("OrgId", "ItemId"), "outer") 
    .select($"OrgId", $"ItemId",$"segmentId_1",$"Sequence_1",$"Action_1") 
    .filter(!$"Action_1".contains("D")) 
    df3.show() 

.. 내가 뭐하는 거지입니다하지만 난 출력 아래 얻고있다.

+----------+------+-----------+----------+--------+ 
|  OrgId|ItemId|segmentId_1|Sequence_1|Action_1| 
+----------+------+-----------+----------+--------+ 
|4295877343| 149|   15|   2| I|!|| 
|4295877341| 136|  null|  null| I|!|| 
|4295877341| 138|   11|  22| I|!|| 
|4295877341| 141|   10|   1| I|!|| 
|4295877341| 143|   1|   1| I|!|| 
+----------+------+-----------+----------+--------+ 

나는 데이터 프레임 1에서 4295877346| 136| 4| 1| I|!| 기록 ...

left_outer 출력 이하 나 제공을 받고 있지 않다

+----------+------+-----------+----------+--------+ 
|  OrgId|ItemId|segmentId_1|Sequence_1|Action_1| 
+----------+------+-----------+----------+--------+ 
|4295877341| 136|  null|  null| I|!|| 
|4295877341| 138|   11|  22| I|!|| 
|4295877341| 141|   10|   1| I|!|| 
|4295877341| 143|   1|   1| I|!|| 
+----------+------+-----------+----------+--------+ 

답변

1

먼저 실수를 설명해 드리겠습니다. 당신은 단지

val df3 = df1.join(df2, Seq("OrgId", "ItemId"), "outer") 
df3.show() 

다음과 같이 가입하면

당신은 그것을뿐만 아니라 Action_1 열에 코드에서 filternull를 필터링하는 것이 분명 가득

+----------+------+---------+--------+------+-----------+----------+--------+ 
|  OrgId|ItemId|segmentId|Sequence|Action|segmentId_1|Sequence_1|Action_1| 
+----------+------+---------+--------+------+-----------+----------+--------+ 
|4295877346| 136|  4|  1| I|!||  null|  null| null| 
|4295877341| 145|  14|  1| I|!||  null|  null| null| 
|4295877343| 149|  null| null| null|   15|   2| I|!|| 
|4295877341| 136|  4|  1| I|!||  null|  null| I|!|| 
| 123456789| 145|  14|  1| I|!||   14|   1| D|!|| 
|4295877341| 138|  2|  1| I|!||   11|  22| I|!|| 
|4295877341| 141|  4|  1| I|!||   10|   1| I|!|| 
|4295877341| 143|  2|  1| I|!||   1|   1| I|!|| 
+----------+------+---------+--------+------+-----------+----------+--------+ 

얻을 것이다

따라서 작업 코드가 null이고, 이후에 얻는 값은입니다.은 데이터가있는 다른 테이블의 데이터를 유효하게합니다.

val df3 = df1.join(df2, Seq("OrgId", "ItemId"), "outer") 
    .withColumn("segmentId_1", when($"segmentId_1".isNotNull, $"segmentId_1").otherwise($"segmentId")) 
    .withColumn("Sequence_1", when($"Sequence_1".isNotNull, $"Sequence_1").otherwise($"Sequence")) 
    .withColumn("Action_1", when($"Action_1".isNotNull, $"Action_1").otherwise($"Action")) 
    .select($"OrgId", $"ItemId",$"segmentId_1",$"Sequence_1",$"Action_1") 
    .filter(!$"Action_1".contains("D")) 
df3.show() 

당신은 기록에 약간의 변화가

+----------+------+-----------+----------+--------+ 
|  OrgId|ItemId|segmentId_1|Sequence_1|Action_1| 
+----------+------+-----------+----------+--------+ 
|4295877346| 136|   4|   1| I|!|| 
|4295877341| 145|   14|   1| I|!|| 
|4295877343| 149|   15|   2| I|!|| 
|4295877341| 136|  null|  null| I|!|| 
|4295877341| 138|   11|  22| I|!|| 
|4295877341| 141|   10|   1| I|!|| 
|4295877341| 143|   1|   1| I|!|| 
+----------+------+-----------+----------+--------+ 
+0

으로 원하는 출력을 얻기해야 ...우리가 DF1의 마지막 레코드와 같은 null 값을 가져오고 DF1의 업데이트가 DF2의 마지막 레코드가 null 인 경우 하나의 특정 열을 가정하면 해당 열에 대해서만 DF1 값을 유지해야합니다. 어떻게 할 수 있습니까? –

+0

죄송합니다. @Anupam, 귀하의 요구 사항을 분명히 이해하지 못했습니다. 좀 더 설명해 주시겠습니까? –

+0

그래서 우리는 DF2 컬럼 값으로 업데이트 할 필요가 없다는 것을 의미하는 칼럼 값이 null 인 어떤 옵션 컬럼이 있습니다. 문자열로 NULL을 입력하십시오. –

0

대신 외부의 왼쪽 외부보십시오 :

val df3 = df1.join(df2, Seq("OrgId", "ItemId"), "left_outer") 
    .select($"OrgId", $"ItemId",$"segmentId_1",$"Sequence_1",$"Action_1") 
    .filter(!$"Action_1".contains("D")) 
    df3.show() 

왼쪽 외부는 왼쪽에 모두 일치하지 않는 것이 유지되어야합니다.

멋진 튜토리얼 here.

관련 문제