anothel의 지식 창고
Apache Spark 데이터 변형 및 집계 기능 - 대규모 데이터 효율화 본문
1. Spark 데이터 변형 및 집계 최적화
Spark는 데이터를 변형하고 요약하는 데 특화된 기능을 제공하며, 대규모 데이터 처리에서 효율적으로 동작한다. 특히 groupBy()와 같은 집계 메서드와 윈도우 함수(Window Function)를 통해 데이터를 그룹화하고 누적 계산할 수 있어, 대용량 데이터 분석에 유용하다.
groupBy()와 집계 함수
groupBy()는 특정 컬럼을 기준으로 데이터를 그룹화해 집계할 때 사용하는 메서드다. Spark는 다양한 집계 함수를 제공하여 대규모 데이터에서도 성능 저하 없이 통계 계산을 가능하게 한다. Pandas에서는 groupby()와 agg()로 유사한 작업을 수행한다.
예를 들어, 특정 연령별 데이터 개수를 집계해보자.
# Pandas에서 groupby와 집계 함수로 데이터 요약
pdf_grouped = pdf.groupby("age").agg({"name": "count"})
print(pdf_grouped)
출력 예시 (Pandas):
name
age
22 1
24 1
27 1
# Spark에서 groupBy와 집계 함수로 데이터 요약
spark_grouped = spark_df.groupBy("age").count()
spark_grouped.show()
출력 예시 (Spark):
+---+-----+
|age|count|
+---+-----+
| 22| 1|
| 24| 1|
| 27| 1|
+---+-----+
이처럼 Spark에서는 분산 처리로 효율적인 집계가 가능하므로, 대규모 데이터에서도 손쉽게 그룹화와 집계 작업을 수행할 수 있다.
집계 함수(Aggregation Functions)
Spark와 Pandas는 데이터의 요약 통계를 계산할 수 있는 다양한 집계 함수를 제공한다. 예를 들어, 각 연령대의 나이 합계를 구하는 코드를 살펴보자.
# Pandas에서 sum() 집계 함수 사용
pdf_sum = pdf.groupby("age").agg({"age": "sum"})
print(pdf_sum)
출력 예시 (Pandas):
age
age
22 22
24 24
27 27
# Spark에서 sum() 집계 함수 사용
spark_sum = spark_df.groupBy("age").sum("age")
spark_sum.show()
출력 예시 (Spark):
+---+--------+
|age|sum(age)|
+---+--------+
| 22| 22|
| 24| 24|
| 27| 27|
+---+--------+
Spark는 집계 함수와 함께 여러 통계적 정보를 산출할 수 있어 대규모 데이터를 신속하게 분석할 수 있다.
Window Function(윈도우 함수)
윈도우 함수는 그룹 내에서 누적 계산이나 순위 계산을 수행하는 기능으로, 시간 흐름에 따른 데이터 분석이나 구간별 통계 계산에서 유용하다. Spark에서는 Window와 함께 row_number, rank, sum 등을 통해 윈도우 함수를 사용할 수 있다. Pandas에서도 cumsum()이나 rank()를 통해 비슷한 작업을 수행할 수 있다.
누적 합계 계산
예를 들어, 나이(age) 컬럼의 누적 합계를 계산하는 방법을 살펴보자.
# Pandas에서 누적 합계 계산
pdf["cumulative_sum"] = pdf["age"].cumsum()
print(pdf)
출력 예시 (Pandas):
name age cumulative_sum
0 Alice 24 24
1 Bob 27 51
2 Cathy 22 73
# Spark에서 누적 합계 계산
from pyspark.sql.window import Window
from pyspark.sql.functions import sum
window_spec = Window.orderBy("age").rowsBetween(Window.unboundedPreceding, Window.currentRow)
spark_df.withColumn("cumulative_sum", sum("age").over(window_spec)).show()
출력 예시 (Spark):
+-----+---+--------------+
| name|age|cumulative_sum|
+-----+---+--------------+
|Cathy| 22| 22|
|Alice| 24| 46|
| Bob| 27| 73|
+-----+---+--------------+
위 예시에서 Window를 통해 데이터를 특정 컬럼 기준으로 누적 계산할 수 있으며, 대규모 데이터에서 특히 유용하다.
순위 계산
순위 계산은 특정 컬럼을 기준으로 데이터를 순서대로 정렬하고, 각 데이터의 순위를 부여하는 작업이다. 예를 들어, 나이(age) 컬럼을 기준으로 순위를 매겨보자.
# Spark에서 순위 계산
from pyspark.sql.functions import row_number
window_spec = Window.orderBy("age")
spark_df.withColumn("rank", row_number().over(window_spec)).show()
출력 예시 (Spark):
+-----+---+----+
| name|age|rank|
+-----+---+----+
|Cathy| 22| 1|
|Alice| 24| 2|
| Bob| 27| 3|
+-----+---+----+
이처럼 순위를 부여하여 데이터를 정렬하고 분석할 수 있어, 분석 지표 생성에 유용하다.
2. Spark SQL을 활용한 데이터 처리
Spark SQL은 SQL에 익숙한 사용자들이 데이터를 손쉽게 조작하고 분석할 수 있도록 도와준다. Spark SQL을 통해 DataFrame을 SQL 구문으로 다룰 수 있으며, Temporary View를 생성하여 SQL 쿼리와 유사한 방식으로 데이터를 조회하고 필터링할 수 있다.
Temporary View 설정과 SQL 구문 활용
Spark SQL을 사용하려면 먼저 DataFrame을 Temporary View로 등록해야 한다. 이후 SQL 구문을 통해 데이터를 조회하거나 필터링하는 작업이 가능하다.
# DataFrame을 Temporary View로 등록
spark_df.createOrReplaceTempView("people")
# SQL 쿼리로 데이터 조회
result_df = spark.sql("SELECT * FROM people WHERE age > 25")
result_df.show()
출력 예시 (Spark):
+----+---+
|name|age|
+----+---+
| Bob| 27|
+----+---+
이와 같이 Spark SQL은 SQL에 익숙한 사용자들에게 직관적인 데이터 조회 및 조작 방식을 제공한다.
SQL과 DataFrame API의 차이점
Spark SQL과 DataFrame API는 동일한 결과를 도출할 수 있지만, 각각의 특징에 따라 더 적합한 상황이 있다. SQL 구문은 SQL에 익숙한 사용자들에게 더 직관적일 수 있고, DataFrame API는 Spark의 다양한 기능을 유연하게 사용할 수 있어 작업 목적에 따라 혼용하는 것이 효과적이다.
예를 들어, filter()와 SQL WHERE 절을 혼용하여 데이터를 조회할 수 있다.
# DataFrame API를 통한 필터링
filtered_df = spark_df.filter(spark_df.age > 25)
filtered_df.show()
출력 예시:
+----+---+
|name|age|
+----+---+
| Bob| 27|
+----+---+
이처럼 상황에 따라 Spark SQL과 DataFrame API를 적절히 혼용하면 효율적인 데이터 처리가 가능하다.
'기술 노트 > Apache Spark' 카테고리의 다른 글
SQL 기반 데이터 결합과 특성 엔지니어링: Apache Spark 활용 가이드 (1) | 2024.11.19 |
---|---|
Apache Spark 머신러닝 분류 및 회귀 모델 - 다양한 모델 학습과 활용 (0) | 2024.11.18 |
Apache Spark ML 파이프라인과 하이퍼 파라미터 튜닝 - 모델 학습 최적화 (0) | 2024.11.17 |
Apache Spark 실무 활용 가이드: 데이터 처리와 최적화 (0) | 2024.03.31 |