RDD를 사용하여 단어 빈도수를 계산

2025. 1. 19. 18:16DATA/Spark

반응형

 

from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark.rdd import RDD

# SparkSession 생성
# SparkSession은 DataFrame API 및 SQL의 진입점
# SparkContext는 RDD API의 진입점
ss: SparkSession = SparkSession.builder.\
    master("local").\  # 로컬 모드에서 Spark 실행 (싱글 코어 또는 멀티 코어)
    appName("wordCount RDD ver").\  # 애플리케이션 이름 설정
    getOrCreate()  # SparkSession이 없으면 새로 생성, 있으면 기존 SparkSession을 반환

# SparkContext를 사용하여 RDD 작업을 수행하기 위한 진입점
sc: SparkContext = ss.sparkContext

# RDD 생성: textFile()을 사용하여 "words.txt" 파일을 읽어 RDD로 변환
# 각 줄을 하나의 항목으로 간주하여 RDD에 저장
text_file: RDD[str] = sc.textFile("words.txt")

# 단어 빈도수를 계산하는 작업
counts = text_file.\
    flatMap(lambda line: line.split(" ")).\  # 각 줄을 공백으로 분리하여 단어를 플랫하게 펼침
    map(lambda word: (word, 1)).\  # 각 단어에 대해 (단어, 1) 형태로 매핑
    reduceByKey(lambda count1, count2: count1 + count2)  # 동일한 단어끼리 값을 합침 (단어 빈도수 계산)

# 결과를 수집하여 출력
output = counts.collect()  # 클러스터에서 실행한 결과를 로컬로 수집 (리스트로 반환)

# 결과 출력 (출력된 결과는 각 단어와 그 빈도수의 튜플)
for word, count in output:
    print(f"{word}: {count}")

 

  1. SparkSession 생성 (SparkSession.builder):
    • SparkSession은 Spark SQL과 DataFrame API를 사용하기 위한 진입점
    • master("local")은 Spark 클러스터를 로컬 모드로 실행하겠다는 의미
    • appName("wordCount RDD ver")은 Spark 애플리케이션의 이름을 설정합니다. 
    • getOrCreate()는 현재 세션이 없으면 새로운 SparkSession을 생성하고, 있으면 기존의 세션을 반환
  2. SparkContext (ss.sparkContext):
    • SparkSession은 SparkContext를 내부적으로 관리 SparkContext는 RDD API와 작업을 수행하기 위한 진입점
    • sc: SparkContext = ss.sparkContext로 SparkContext 객체를 얻음
  3. RDD 생성 (sc.textFile):
    • sc.textFile("words.txt")는 "words.txt" 파일을 읽어 RDD로 변환한다. 각 줄은 RDD의 하나의 항목이 된다. 이 경우, 각 줄을 text_file이라는 RDD에 저장한다.
  4. 단어 빈도수 계산:
    • flatMap(lambda line: line.split(" ")):
      • 각 줄을 공백을 기준으로 단어별로 나누어 플랫하게 펼친다. 즉, 하나의 줄을 여러 개의 단어로 분리하여 RDD로 변환
      • 예를 들어, "hello world"라는 줄이 있으면, 이 줄은 ["hello", "world"]라는 형태로 변환된다.
    • map(lambda word: (word, 1)):
      • 각 단어에 대해 (단어, 1) 형태로 변환 즉, 모든 단어를 (단어, 1) 튜플로 변환하여 각 단어에 대해 1을 카운팅
    • reduceByKey(lambda count1, count2: count1 + count2):
      • reduceByKey는 동일한 키(단어)에 대해 값을 합치는 작업을 수행. 즉, 동일한 단어가 여러 번 등장하면 그 횟수를 합산한다.

 

만약 words.txt 파일에 다음과 같은 내용이 있다면:

hello world hello
spark is awesome
hello spark

출력은 

hello: 3
world: 1
spark: 2
is: 1
awesome: 1

 

  • flatMap은 각 항목을 여러 개로 분리하는 데 사용되고 map은 각 항목을 하나로 변환한다.
  • reduceByKey는 동일한 키에 대해 값을 합치거나 집계하는 데 사용된다.

 

반응형