프로그래밍/PySpark

[PySpark] 특정(여러) 문자열(strings)이 포함된 데이터 필터로 뽑아내기.

히또아빠 2023. 8. 31. 17:47


우선 데이터 프레임 내에서 한 string 스키마 구조의 컬럼에서 특정 문자열이 포함된 데이터를 filter로 걸러내는 코드는 아래와 같다.

아래에서는 search strings list에 있는 단어들을 포함하고 있는 데이터를 뽑아내는 방법이다.

여러 단어들이 아닌 한 단어를 포함하고 있는 데이터를 뽑고자 할때는 reduce 함수를 쓸 필요 없이 아래와 같이 pyspark 내장함수를 활용하면 된다.

  • df.filter(col("col1").contains("기내용")) - 기내용이 포함된 데이터 산출
  • df.filter(~col("col1").contains("기내용")) - 기내용이 포함되지 않은 데이터 산출
from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from functools import reduce

# Create a Spark session
spark = SparkSession.builder.appName("TitleCount").getOrCreate()

# Sample data
data = [("아메리칸투어리스터 여행 가방",),
        ("기내용 가방 여행용",),
        ("여권 보관지갑",),
        ("트래커 스마트 기기",),
        ("베트남 여행 가이드",),
        ("수화물 포장 비용",),
        ("캐리어는 다용도로 사용 가능",),
        ("이것은 테스트 문장입니다",)]

# Create a DataFrame
df = spark.createDataFrame(data, ["title"])

# Strings to search for
search_strings = ["아메리칸투어리스터", "기내용", "여권", "트래커", "베트남", "수화물", "캐리어"]

# Add filter conditions for each search string
conditions = [col("title").contains(search_string) for search_string in search_strings]

##not_conditions = [~col("title").contains(search_string) for search_string in search_strings]

# Apply the filters and group by "title" to count occurrences
result_df = df.filter(reduce(lambda a, b: a | b, conditions)).groupBy("title").count()

# Show the result
result_df.show(300, truncate=False)

# Stop the Spark session
spark.stop()
300x250
반응형