[Spark] Pyspark NoneType, null, blank, empty string 필터링 하는 방법

2021. 5. 6. 02:09 Big Data/Apache Spark

Pyspark NoneType, Null, Blank, Empty String 필터링 하는 방법

pyspark에서 NoneType, NULL, Blank, Empty String 등 사용지 않는 값을 필털이 하는 방법에 대해서 설명을 한다.

  • SQL로 진행하면 컬럼 하나 하나에 대해서 WHERE 절을 이용해서 필터링을 해야한다.
  • 하지만 spark에서 Condition을 생성하고, 해당 Condition을 filter() 함수의 인자로 넘겨주면, 동일한 조건으로 모든 컬럼에 적용이 가능하다.
  • 코드에서 살펴볼 내용
    • None, Null Empty String이 포함된 Row만 추출이 가능
    • None, Null, Empty String을 제외한 모든 Row만 추출도 가능
  • 코드 설명
    • 간단하게 각각 컬럼에 공통적으로 적용할 condition을 입력을 하고, map함수를 이용해 모든 컬럼에 적용을 한다.
    • 마지막에는 reduce함수를 이용해 condition을 모두 "&"(and) 또는 "|"(or) 로 연결하면 condition은 정의 완성
    • 정의된 condition을 filter함수에 넘기면 내가 원하는 Row만 추출이 가능하다.
    • Condition 예)Column<(((CODE IS NOT NULL) AND (NOT (CODE = ))) AND ((TYPE IS NOT NULL) AND (NOT (TYPE = ))))>

 

소스코드

import pyspark.sql.functions as F
df = sqlContext.createDataFrame([
    (1, "A", "X1"),
    (2, None, "X2"),
    (3, "B", None),
    (1, "", "X3"),
    (2, "", "X2"),
    (3, "C", "X2"),
    (1, None, None),
    (1, "", ""),
    (1, "X3", "X8"),
], ["ID", "TYPE", "CODE"])
df.show()

### NULL, Empty String Blank가 포함된 ROW는 모두 제거

import pyspark.sql.functions as F
columns = set(df.columns) - set(['ID'])
cond = map(lambda x: (col(x).isNotNull()), df.columns)
# [Column<(ID IS NOT NULL)>, Column<(TYPE IS NOT NULL)>, Column<(CODE IS NOT NULL)>]
cond = map(lambda x: (col(x)) != "", columns)
# [Column<(NOT (CODE = ))>, Column<(NOT (TYPE = ))>]

cond = map(lambda x: (col(x).isNotNull()) & (col(x) != ""), columns)
cond = reduce((lambda x, y: x & y), cond)
# Column<(((CODE IS NOT NULL) AND (NOT (CODE = ))) AND ((TYPE IS NOT NULL) AND (NOT (TYPE = ))))>
df.filter(cond).show()

### NULL, Empty String, Blank가 포함된 ROW만 선택

cond = map(lambda x: (col(x).isNull()) | (col(x) == ""), df.columns)
cond = reduce((lambda x, y: x | y), cond)
df.filter(cond).show()

# Column<((((ID IS NULL) OR (ID = )) OR ((TYPE IS NULL) OR (TYPE = ))) OR ((CODE IS NULL) OR (CODE = )))>

 

출처 : ourcstory.tistory.com/529?category=630696