anothel의 지식 창고

Apache Spark 데이터 변형 및 집계 기능 - 대규모 데이터 효율화 본문

기술 노트/Apache Spark

Apache Spark 데이터 변형 및 집계 기능 - 대규모 데이터 효율화

anothel 2024. 11. 16. 23:30

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를 적절히 혼용하면 효율적인 데이터 처리가 가능하다.

728x90