전편
☞ 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)
'Data Engineering > 스파크' 카테고리의 다른 글
스파크 NULL 처리 (스파크 정리 9) (0) | 2022.10.08 |
---|---|
스파크 repartition, coalesce, collect (스파크 정리 7) (0) | 2022.09.29 |
스파크 filter, where, sort, sample, split, union (스파크 정리 6) (0) | 2022.09.27 |
스파크 select, selctExpr, lit, distinct, limit (스파크 정리 5) (0) | 2022.09.25 |
스파크 기본 명령어, 스파크 데이터프레임 명령어 (스파크 정리 4) (0) | 2022.09.24 |
댓글