본문 바로가기
Data Engineering/스파크

스파크 NULL 처리 (스파크 정리 9)

by 무언가 하는 소소 2022. 10. 8.
728x90
반응형

 

 

전편

2022.09.27 - [Data Engineering/스파크] - 스파크 정규표현식 (스파크 정리 8)

 

이번 실습을 진행하기 위해서 이전 포스팅(2022.09.16 - [Data Engineering/스파크] - 스파크란? 스파크 기본 개념 (스파크 정리 2))을 참고하여 데이터를 다운 받은 후 spark.read()를 이용하여 데이터프레임으로 데이터를 읽어오자. 

// in Scala
val df = spark.read.format("json")
  .load("/data/flight-data/json/2015-summary.json")

 

# in python
df = spark.read.format("json").load("/data/flight-data/json/2015-summary.json")

 

 

NULL 처리

스파크에서 널 데이터는 보통 두가지 방식으로 처리한다. 첫 번째 방법은 널 밸류를 삭제하는 것이고, 두 번째는 다른 값으로 채우는 것이다. 스파크에서는 널 데이터를 처리하기 위한 패키지 na를 제공한다. 

 

 

1. coalesce()

coalesce() 함수는 널이 아닌 첫 번째 데이터를 반환한다. 

// in Scala
import org.apache.spark.sql.functions.coalesce
df.select(coalesce(col("Description"), col("CustomerId"))).show()
# in Python
from pyspark.sql.functions import coalesce
df.select(coalesce(col("Description"), col("CustomerId"))).show()
 

 

2. drop()

drop() 함수는 널을 포함한 열을 삭제한다. 즉, 로우에서 널인 값이 하나라도 있으면 해당 로우는 삭제된다. 

df.na.drop()

 

만약 로우의 모든 값이 널인 경우에만 로우를 삭제하고 싶다면 drop() 함수의 인자로 "all"을 넘겨주면 된다. 

df.na.drop("all")

 

특정 컬럼값의 널 여부만 조사하고 싶다면 마찬가지로 drop() 함수에 컬럼의 리스트를 넘겨주면 된다. 

// in Scala
df.na.drop("all", Seq("StockCode", "InvoiceNo"))

 

# in Python
df.na.drop("all", subset=["StockCode", "InvoiceNo"])

 

 

3. fill()

fill() 함수를 사용하면 널인 값을 다른 값으로 바꿀 수 있다. 예를 들어 아래의 코드는 데이터프레임의 모든 널 값을 "All Null values become this string"이라는 문자열로 대체한다.

df.na.fill("All Null values become this string")

 

fill() 함수는 drop()과 마찬가지로 특정 컬럼의 널 값만 바뀌도록 컬럼 리스트를 인자로 넘겨 줄 수 있다. 아래 예시는 "StockCode"와 "InvoiceNo" 컬럼에 있는 널 값을 정수 5로 바꾸는 코드이다. 

// in Scala
df.na.fill(5, Seq("StockCode", "InvoiceNo"))

 

# in Python
df.na.fill("all", subset=["StockCode", "InvoiceNo"])

 

스칼라에서는 Map 함수, 파이썬에서는 딕셔너리를 사용하면 여러 컬럼에 대해 컬럼에 있는 널 값을 각기 다른 값으로 바꿀 수 있다. 

 

// in Scala
val fillColValues = Map("StockCode" -> 5, "Description" -> "No Value")
df.na.fill(fillColValues)

 

# in Python
fill_cols_vals = {"StockCode": 5, "Description" : "No Value"}
df.na.fill(fill_cols_vals)

 

 

4. replace()

replace() 함수도 널 값을 다른 값으로 바꿀 때 쓸 수 있다. 하지만 replace() 함수는 널 값에만 뿐만 아니라 다른 일반적인 값에도 쓸 수 있다. 아래 코드는 "Description" 컬럼에 있는 빈 문자열을 "UNKOWN" 문자열로 바꾼다. 

// in Scala
df.na.replace("Description", Map("" -> "UNKNOWN"))

 

# in Python
df.na.replace([""], ["UNKNOWN"], "Description")



다음편

728x90
반응형

댓글