2016-10-06 4 views
7

largeDataFrame (여러 열 및 수십억 개의 행)과 smallDataFrame (단일 열 및 10,000 행)이 있습니다.필터 스파크 블랙리스트 기준을 지정하는 다른 DataFrame을 기반으로하는 데이터 프레임

largeDataFramesome_identifier 열이 smallDataFrame의 행 중 하나와 일치 할 때마다 largeDataFrame에서 모든 행을 필터링하고 싶습니다.

some_idenfitier,first_name 
111,bob 
123,phil 
222,mary 
456,sue 

smallDataFrame

some_identifier 
123 
456 

desiredOutput

111,bob 
222,mary 

여기 내 추한 솔루션입니다

largeDataFrame :

다음은 예입니다.

val smallDataFrame2 = smallDataFrame.withColumn("is_bad", lit("bad_row")) 
val desiredOutput = largeDataFrame.join(broadcast(smallDataFrame2), Seq("some_identifier"), "left").filter($"is_bad".isNull).drop("is_bad") 

클리너 솔루션이 있습니까?

답변

21

이 경우 leftanti 조인을 사용해야합니다.

왼쪽 반 결합반의 왼쪽 반과 반대입니다.

largeDataFrame 
    .join(smallDataFrame, Seq("some_identifier"),"leftanti") 
    .show 
// +---------------+----------+ 
// |some_identifier|first_name| 
// +---------------+----------+ 
// |   222|  mary| 
// |   111|  bob| 
// +---------------+----------+ 
+2

을 그리고 당신이 정말로 열거 할 때 당신이 문자열을 사용하지 않는 이유이다 - 데이터 집합의 scaladoc을 :

그것은 주어진 키에 따라 왼쪽 테이블에 오른쪽 테이블에서 데이터를 필터링합니다. 참여자는 옵션으로 좌선을 언급하지 않으므로 어떤 옵션이 있는지 파악하는 것은 불가능합니다. 심층적 인 다이빙을하지 않아도됩니다. 나는 이것이 Jira를 보증하는 것처럼 느껴지기 시작했습니다 - 그리고 전에 API의 선택에 의해 오줌 누 렸습니다. –

+1

솔직히 말해서이 답변을 작성했을 때 Dataset은 실험적이었고 여전히 큰 팬이 아닙니다. – eliasah

+2

고맙게도 Jacek는 조인을위한 설명서 (https : //jaceklaskowski.gitbooks)가 가득 찼습니다. io/mastering-apache-spark/content/spark-sql-joins.html - 여기에 남겨두면 다른 사람의 삶이 편하게됩니다. –

관련 문제