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

스파크 정규표현식 (스파크 정리 8)

by 무언가 하는 소소 2022. 9. 27.
728x90
반응형

 

 

전편

2022.09.29 - [Data Engineering/스파크] - 스파크 repartition, coalesce, collect (스파크 정리 7)

 

 

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

// in Scala
val df = spark.read.format("csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .load("/data/retail-data/by-day/2010-12-01.csv")
df.printSchema()
df.createOrReplaceTempView("dfTable")

 

# in Python
df = spark.read.format("csv")\
  .option("header", "true")\
  .option("inferSchema", "true")\
  .load("/data/retail-data/by-day/2010-12-01.csv")
df.printSchema()
df.createOrReplaceTempView("dfTable")

 

 

정규표현식

스파크에서는 정규표현식을 사용하여 문자열을 다룰 수 있다. 정규표현식을 사용하기 위해서는 두가지 함수, regexp_extract와 regexp_replace를 사용하면 된다. 정규표현식을 한번도 다뤄본 적 없다면 아래 내용을 이해하기 쉽지 않으니 우선 정규표현식을 공부하길 바란다. 

 

 

1. regexp_replace()

regexp_replace를 사용하면 특정 타깃 문자열을 원하는 문자열로 바꿀 수 있다. regexp_replace(컬럼, 타깃 문자열, 원하는 문자열)과 같이 쓰면 된다. 아래는 데이터프레임의 특정 컬럼에서 ("BLACK", "WHITE", "RED", "GREEN", "BLUE")에 해당하는 문자열을 "COLOR"라는 문자열로 바꾸는 코드이다. 

// in Scala
import org.apache.spark.sql.functions.regexp_replace
val simpleColors = Seq("black", "white", "red", "green", "blue")
val regexString = simpleColors.map(_.toUpperCase).mkString("|")
// the | signifies `OR` in regular expression syntax
df.select(
  regexp_replace(col("Description"), regexString, "COLOR").alias("color_clean"),
  col("Description")).show(2)

 

# in Python
from pyspark.sql.functions import regexp_replace
regex_string = "BLACK|WHITE|RED|GREEN|BLUE"
df.select(
  regexp_replace(col("Description"), regex_string, "COLOR").alias("color_clean"),
  col("Description")).show(2)
===============================================================================================
>> 출력
+--------------------+--------------------+
|         color_clean|         Description|
+--------------------+--------------------+
|COLOR HANGING HEA...|WHITE HANGING HEA...|
| COLOR METAL LANTERN| WHITE METAL LANTERN|
+--------------------+--------------------+

 

 

2. translate()

translate() 함수를 이용하면 같은 작업을 문자열이 아닌 캐릭터 단위로도 할 수 있다. 아래 코드는 데이터프레임의 특정 컬럼에서 'L', 'E', 'T' 캐릭터를 각각 '1', '3', '7' 캐릭터로 바꾸는 코드이다. 

// in Scala
import org.apache.spark.sql.functions.translate
df.select(translate(col("Description"), "LEET", "1337"), col("Description"))
  .show(2)

 

# in Python
from pyspark.sql.functions import translate
df.select(translate(col("Description"), "LEET", "1337"),col("Description"))\
  .show(2)
===============================================================================================
>> 출력
+----------------------------------+--------------------+
|translate(Description, LEET, 1337)|         Description|
+----------------------------------+--------------------+
|              WHI73 HANGING H3A...|WHITE HANGING HEA...|
|               WHI73 M37A1 1AN73RN| WHITE METAL LANTERN|
+----------------------------------+--------------------+

 

 

3. regexp_extract()

regexp_extract()는 이름에서 알 수 있듯이 타깃 문자열을 추출하는 함수이다. 아래 코드는 regexp_extract를 활용한 예시로 데이터프레임의 특정 컬럼에서 타깃 문자열("BLACK", "WHITE", "RED", "GREEN", "BLUE") 중 첫 번째로 등장하는 문자열을 추출한다. 

// in Scala
import org.apache.spark.sql.functions.regexp_extract
val regexString = simpleColors.map(_.toUpperCase).mkString("(", "|", ")")
// the | signifies OR in regular expression syntax
df.select(
     regexp_extract(col("Description"), regexString, 1).alias("color_clean"),
     col("Description")).show(2)

 

# in Python
from pyspark.sql.functions import regexp_extract
extract_str = "(BLACK|WHITE|RED|GREEN|BLUE)"
df.select(
     regexp_extract(col("Description"), extract_str, 1).alias("color_clean"),
     col("Description")).show(2)
===============================================================================================
>> 출력
+-------------+--------------------+
|  color_clean|         Description|
+-------------+--------------------+
|        WHITE|WHITE HANGING HEA...|
|        WHITE| WHITE METAL LANTERN|
+-------------+--------------------+

 

 

4. contains(), instr()

타깃 문자열의 단순 포함여부도 볼 수 있다. 자바 및 스칼라에서는 contains(), 파이썬에서는 instr() 함수를 사용하면 된다. 아래 코드는 데이터프레임의 특정 컬럼에서 "BLACK"이나 "WHITE" 문자열을 포함하는 레코드만 추출하는 예시이다.

// in Scala
val containsBlack = col("Description").contains("BLACK")
val containsWhite = col("DESCRIPTION").contains("WHITE")
df.withColumn("hasSimpleColor", containsBlack.or(containsWhite))
  .where("hasSimpleColor")
  .select("Description").show(3, false)

 

# in Python
from pyspark.sql.functions import instr
containsBlack = instr(col("Description"), "BLACK") >= 1
containsWhite = instr(col("Description"), "WHITE") >= 1
df.withColumn("hasSimpleColor", containsBlack | containsWhite)\
  .where("hasSimpleColor")\
  .select("Description").show(3, False)
===============================================================================================
>> 출력
+----------------------------------+
|Description                       |
+----------------------------------+
|WHITE HANGING HEART T-LIGHT HOLDER|
|WHITE METAL LANTERN               |
|RED WOOLLY HOTTIE WHITE HEART.    |
+----------------------------------+

 

 

다음편

2022.10.08 - [Data Engineering/스파크] - 스파크 NULL 처리 (스파크 정리 9)

 

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

전편 ☞ 2022.09.27 - [Data Engineering/스파크] - 스파크 정규표현식 (스파크 정리 8) 이번 실습을 진행하기 위해서 이전 포스팅(2022.09.16 - [Data Engineering/스파크] - 스파크란? 스파크 기본 개념 (스파크..

dogfootja.tistory.com

728x90
반응형

댓글