반응형
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 = ))))>
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 = )))> |
반응형
'빅데이터 > Spark' 카테고리의 다른 글
[Spark] Pyspark에서 NoneType Filtering 하는 방법 (0) | 2019.03.24 |
---|---|
[Spark] 스파크에서 외부 라이브러리 사용하는 방법 (0) | 2016.11.08 |
[Spark] timestamp에서 날짜 추출하는 방법 (month, day, hour) (0) | 2016.08.09 |
[Spark] Row의 Seq Collection으로 RDD, DataFrame 생성하기 (0) | 2016.08.03 |
[Spark] Json 포맷 처리하기 - Json Object List (0) | 2016.08.03 |