2017-11-29 20 views
0
두 개의 레코드 사이

차이는 두 dataframes 무엇을 비교하는 방법이두 dataframes이 스파크에 새로운 컬럼으로 값을 일치 잘못을 추가 비교

enter image description here

같은

df1.except(df2) 

그 결과 얻기 변경 및 & 중 어느 열이 변경되었는지 확인하려면이 값을 열로 추가하십시오. 이

enter image description here

+0

당신은 칼럼의 콘텐츠를 만들 ** 발언 **하는 방법을 의미합니까? 그렇다면 해당 열의 내용을 완전히 표시 할 수 있습니까? –

+0

제외는 일종의 마이너스 연산입니다. 나는 사람들이 이해하고 더 잘 대답 할 수 있도록 도와주는 몇 가지 모범을 질문에 추가 할 것을 제안한다. –

+0

예 : 이전 데이터에서 성, 성, 주소가 새 데이터와 일치하지 않습니다. 이 정보를 비고란에 기입하십시오.
예를 들면 : 오래된 데이터 james에서 새로운 데이터 nitin. 이제이 정보를 일치하지 않는 firstname으로 가져옵니다. 동시에 두 번째 열의 열을 비교하십시오. 이 정보를 같은 열에도 표시하십시오. –

답변

1

같은 예상 출력 나중에 열 값 모두 (신구 값)를 통과 칼럼 UDF와를 이용하여 기본 키 두 dataframe 가입 UDF의 데이터를 비교하여 값을 반환 같지 않으면.

val check = udf ((old_val:String,new_val:String) => if (old_val == new_val) new_val else "") 

df_check= df 
    .withColumn("Check_Name",check(df.col("name"),df.col("new_name"))) 
    .withColumn("Check_Namelast",check(df.col("lastname"),df.col("new_lastname"))) 

또는 데프 기능

  def fn(old_df:Dataframe,new_df:Dataframe) : Dataframe = 
      { 
      val old_df_array = old_df.collect() //make df to array to loop thru 
      val new_df_array = new_df.collect() //make df to array to loop thru 
      var value_change : Array[String] = "" 

      val count = old_df.count 
      val row_count = old_df.coloumn 
      val row_c = row.length 
      val coloumn_name = old_df.coloumn 

      for (i to count) //loop thru all rows 
      { 
      var old = old_df_array.Map(x => x.split(",")) 
      var new = new_df_array.Map(x => x.split(",")) 
      for (j to row_c) //loop thru all coloumn 
      { 
      if(old(j) != new(j)) 
      { 
      value_change = value_change + coloumn_name(j) " has value changed" ///this will add all changes in one full row 
      } 
      //append to array 
      append j(0) //primary key 
      append value_change //Remarks coloumn 
      } 
      } 
      //convert array to df 
      }