2017-10-18 1 views
-1

4 개의 열을 포함하는 데이터 프레임이 있습니다.맞춤형 사용자 정의 집계 고유 함수를 생성하는 방법

Dataframe 샘플 행에 데이터의 2 개 종류가있다

id1 id2 id3 id4 
--------------- 
a1 a2 a3 a4 
b1 b2 b3 b4 
b1 b2 b3 b4 
c1 c2 c3 c4 
    b2  
c1 
     a3 
      a4 
c1 
     d4 

중 모든 열 데이터 또는 단지 하나의 열을 갖는다.

행 사이의 값을 비교하는 동안과 같이 모든 열에 고유 한 기능을 수행하려는 경우 행에있는 값만 비교하고 null 값은 고려하지 않습니다.

dataframe 출력은 I 스파크 UDAF에 여러 예를 보았다

id1 id2 id3 id4 
a1 a2 a3 a4 
b1 b2 b3 b4 
c1 c2 c3 c4 
     d4 

이어야한다. 그러나 따라 수정할 수 없습니다.

+0

가 왜 네 개의 컬럼에 필터 방법을 사용하지 않는? –

+0

필터가 어떻게 도움이 될 수 있습니까? – Kaushal

+0

아래의 내 대답을 참조하십시오. –

답변

1

당신은

df.filter($"id1" =!= "" && $"id2" =!= "" && $"id3" =!= "" && $"id4" =!= "") 

아래로 모든 컬럼에 대한 filter을 사용할 수 있으며 최종 dataframe을 얻어야한다.

위 코드는 정적 4 열 데이터 프레임 용 코드입니다. 위의 4 개 이상의 열이있는 경우 너무 많은 논리 검사를 작성해야하므로 바쁜 방법이됩니다.

가의 해결책 내가 대답은 도움이 희망

import org.apache.spark.sql.functions._ 
def checkIfNull = udf((co : mutable.WrappedArray[String]) => !(co.contains(null) || co.contains(""))) 
df.filter(checkIfNull(array(df.columns.map(col): _*))).show(false) 

아래로 udf 기능을 사용하는 것입니다

+0

ans를 가져 주셔서 감사합니다하지만 먼저 다른 행에있는 하나의 행의 값을 확인하거나 그렇지 않으면 그것을 제거 그렇지 않으면 그 행을 유지해야합니다. 수정 된 질문을 참조하십시오. – Kaushal

1

그것은 순서가이 문제를 해결하기 위해 의존하는 dropDuplicates을 활용할 수 있으며, 대답 here을 참조하십시오. 그러나 매우 효율적이지는 않습니다.보다 효율적인 솔루션이 있어야합니다.

먼저 모든 복제본을 distinct()으로 제거한 다음 각 열별로 반복적으로 정렬하고 중복 된 사본을 삭제하십시오. 열은 내림차순으로 정렬되어 nulls으로 표시되고 마지막에 배치됩니다. 네 개의 정적 열

예 :

val df2 = df.distinct() 
    .orderBy($"id1".desc).dropDuplicates("id1") 
    .orderBy($"id2".desc).dropDuplicates("id2") 
    .orderBy($"id3".desc).dropDuplicates("id3") 
    .orderBy($"id4".desc).dropDuplicates("id4") 
+0

ans 주셔서 감사하지만 처음에는 다른 행에있는 한 행의 값을 확인하거나 그 다음 행을 유지해야합니다. 수정 된 질문을 참조하십시오. – Kaushal

+0

그리고 빈 열에는'null' 만 포함되어 있습니다.'' "'문자열이 없습니다. – Kaushal

+0

@Kaushal 가능하지만 최선의 해결책은 아닐 수도 있습니다. – Shaido

관련 문제