변환과 액션
지연 계산을 알아봅니다
변환과 액션은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
두 가지 연산
Spark 연산은 변환(새 데이터세트를 지연 방식으로 생성)과 작업(계산을 시작하고 결과를 반환하거나 출력을 기록)으로 나뉩니다.
지연 평가
변환은 지연됩니다. 수행할 작업만 기록하고 실제로는 아무것도 실행하지 않습니다. Spark는 변환의 방향성 비순환 그래프(DAG)를 구성하고 작업이 호출될 때만 실행합니다.
map과 filter
map은 각 요소를 변환하고, filter는 조건자에 일치하는 요소를 유지합니다. 둘 다 새로운 RDD 또는 Dataset을 반환하며 아직 실행하지는 않습니다.
val nums = sc.parallelize(1 to 10)
val evens = nums.filter(_ % 2 == 0).map(_ * 10)
// nothing computed yetflatMap
flatMap은 각 요소를 0개 이상의 출력으로 매핑한 다음 이를 평탄화합니다. 줄을 단어로 분할할 때 대표적으로 사용됩니다.
val lines = sc.parallelize(Seq("hello world", "spark rocks"))
val words = lines.flatMap(_.split(" "))일반적인 작업
작업은 실행을 트리거합니다:
collect— 모든 결과를 드라이버로 가져옵니다count— 요소의 개수를 셉니다first/take(n)— 행을 샘플링합니다reduce— 하나의 값으로 접습니다
val total = sc.parallelize(1 to 100).reduce(_ + _)
println(total) // 5050 — runs now좁은 변환과 넓은 변환
좁은 변환(map, filter)에는 데이터 이동이 필요하지 않습니다. 넓은 변환(groupByKey, reduceByKey, join)은 네트워크 전체에서 셔플을 트리거합니다.
reduceByKey
키-값 RDD에서 reduceByKey는 키별로 값을 집계합니다. 셔플하기 전에 로컬에서 결합하므로 groupByKey보다 효율적입니다.
val pairs = sc.parallelize(Seq(("a", 1), ("b", 1), ("a", 1)))
val counts = pairs.reduceByKey(_ + _)
// (a, 2), (b, 1)캐싱
데이터셋을 여러 작업에서 재사용한다면 cache 또는 persist를 사용해 메모리에 유지할 수 있으므로 매번 다시 계산하지 않아도 됩니다.
val cached = sc.parallelize(1 to 1000).filter(_ % 3 == 0).cache()
println(cached.count())
println(cached.sum())DataFrame 변환
DataFrame에는 고유한 지연 변환이 있습니다: select, where, withColumn, orderBy. show 및 collect와 같은 작업이 이러한 변환을 실행합니다.
import org.apache.spark.sql.functions._
val adults = df.where(col("age") >= 18)
.withColumn("adult", lit(true))
adults.show()단어 수 세기의 고전
표준적인 Spark 작업은 행을 분할하고, 각 단어를 1에 매핑한 다음, 키별로 줄이는 것입니다. 마지막 collect만 파이프라인을 실행합니다.
val text = sc.textFile("book.txt")
val counts = text.flatMap(_.split(" "))
.map(w => (w, 1))
.reduceByKey(_ + _)
counts.collect().foreach(println)순수 Scala의 지연 처리 예시
독립적으로 실행할 수 있는 Scala 예시입니다. 지연 뷰는 강제로 평가될 때까지 작업을 미루며, Spark의 변환과 작업 분리를 그대로 보여 줍니다.
object Main {
def main(args: Array[String]): Unit = {
val pipeline = (1 to 10).view.filter(_ % 2 == 0).map(_ * 10) // lazy
val result = pipeline.toList // forces evaluation (action)
println(result)
}
}빠른 확인
Spark는 map과 filter 변환이 연결된 작업을 실제로 언제 실행할까요?
복습
Spark의 실행 모델을 학습했습니다:
- 변환은 지연 방식입니다(
map,filter,flatMap,reduceByKey) - 작업이 실제 처리를 트리거합니다(
collect,count,reduce) - 좁은 연산과 넓은 연산(셔플)
- 결과를 재사용하기 위한
cache
다음 주제: Spark SQL
자주 묻는 질문
“변환과 액션” 강의는 무료인가요?
네 — “변환과 액션” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
“변환과 액션”에서 뭘 배우나요?
지연 계산을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“변환과 액션” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.