2017-02-24 1 views
0

데이터 프레임 스파크 (2 DF의의 조합이다)를 DF에 적용 할 때 예상대로 작동하지 않습니다필터가

def unionByName(a: DataFrame, b: DataFrame): DataFrame = { 
    val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).toSeq 
    a.select(columns: _*).unionAll(b.select(columns: _*)) 
} 

결과는 : 데이터 프레임 C

아래 열 이름이 dataframes에 UnionAll
SN Hash_id Name 
111 11ww11 Airtel 
222 null Idea 
333 null BSNL 
444 22ee11 Vodafone 

데이터 프레임 c에서 필터를 수행합니다.

val withHashDF = c.where(c("Hash_id").isNotNull) 
val withoutHashDF = c.where(c("Hash_id").isNull) 

withHashDF 대한 결과는 다음

444 22ee11 Vodafone 
: 단지 해시 ID가 존재 B가없는 데이터 프레임을 녹음합니다

111 11ww11 Airtel 

프레임을 형성하는 데이터에 대한 결과를 얻을

에 대한 결과는

222 null Idea 
BSNL 333 null  
null 222 Idea 
입니다.

이 DF에서 열 값은 열 이름과 같지 않으며 개수는 3이어야합니다. 2. 데이터 프레임 "a"행이 반복됩니다. unionByName에서

+0

정상적으로 작동합니다. unionByName 메서드가 호출 된 곳과 데이터 프레임 c가 채워지는 곳의 문제와 같습니다. –

답변

0

봐 예상대로 다음 작동합니다

val columns = a.columns.intersect(b.columns).map(row => new Column(row)).toSeq 

val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).toSeq 

에서 columns

변화를 얻기에 작은 변화가있다. 전체 코드에서

봐는 & 결과 아래 니펫을 :

import sparkSession.sqlContext.implicits._ 
import org.apache.spark.sql.DataFrame 
import org.apache.spark.sql.Column 

val dataFrameA = Seq(("111", "11ww11", "Airtel"),("222", null, "Idea")).toDF("SN","Hash_id", "Name") 
val dataFrameB = Seq(("333", null, "BSNL"),("444", "22ee11", "Vodafone")).toDF("SN","Hash_id", "Name") 

def unionByName(a: DataFrame, b: DataFrame): DataFrame = { 
    val columns = a.columns.intersect(b.columns).map(row => new Column(row)).toSeq 
    a.select(columns: _*).union(b.select(columns: _*)) 
} 

val dataFrameC = unionByName(dataFrameA, dataFrameB) 
val withHashDF = dataFrameC.where(dataFrameC("Hash_id").isNotNull) 
val withoutHashDF = dataFrameC.where(dataFrameC("Hash_id").isNull) 

println("dataFrameC") 
dataFrameC.show() 

println("withHashDF") 
withHashDF.show 

println("withoutHashDF") 
withoutHashDF.show 

출력 :

dataFrameC 
+---+-------+--------+ 
| SN|Hash_id| Name| 
+---+-------+--------+ 
|111| 11ww11| Airtel| 
|222| null| Idea| 
|333| null| BSNL| 
|444| 22ee11|Vodafone| 
+---+-------+--------+ 

withHashDF 
+---+-------+--------+ 
| SN|Hash_id| Name| 
+---+-------+--------+ 
|111| 11ww11| Airtel| 
|444| 22ee11|Vodafone| 
+---+-------+--------+ 

withoutHashDF 
+---+-------+----+ 
| SN|Hash_id|Name| 
+---+-------+----+ 
|222| null|Idea| 
|333| null|BSNL| 
+---+-------+----+ 
+0

unionbyname을 변경 한 후에도 결과가 올바르지 않습니다. 나는 더러운 읽기가 일어나고 있다고 의심하고 있습니다. 하지만 어떻게 처리해야할지 모르겠다. –

0

Dataframe (Unionall)에서 중복이있는 경우, 그것은 필터 또는 WHERE 절에 대한 예기치 않은 결과를 제공합니다 . 고유 한 방법을 사용하여 중복을 제거하면 예상대로 결과가 나타납니다.