Spark SQL에서는 데이터를 다룰 때 정렬이나 파티셔닝 전략을 선택할 수 있는 여러 키워드를 제공합니다. 이러한 키워드들은 결과 데이터의 정렬 순서, 병렬 처리 방식, 그리고 전체 쿼리 성능에 직접적인 영향을 미치기 때문에, 각 키워드의 특성과 동작 방식을 정확하게 이해하고 적절히 활용하는 것이 매우 중요합니다.


Sorting

ORDER BY

ORDER BY는 전체 데이터를 하나의 파티션으로 모은 뒤 정렬하는 방식입니다. 이는 전역 정렬을 의미하며, 가장 직관적이지만 병렬 처리를 하지 못하기 때문에 성능상 제약이 가장 큽니다. 데이터 양이 많을 경우 OOM이 발생할 수 있습니다. 그럼에도 불구하고 결과 전체의 순서를 명확히 보장해야 할 때 사용합니다.

spark.sql("SELECT * FROM my_table ORDER BY col DESC").show()
df.orderBy("col", ascending=False)

SORT BY

SORT BY는 각 파티션 내부에서만 정렬을 수행합니다. 전체 정렬 순서를 보장하지 않지만, 파티션 단위로 데이터를 병렬로 정렬할 수 있어 ORDER BY보다 훨씬 효율적입니다.

spark.sql("SELECT * FROM my_table SORT BY col").show()
df.sortWithinPartitions("col").show()

Partitioning

DISTRIBUTE BY

DISTRIBUTE BY는 지정한 컬럼 값을 기준으로 데이터를 다양한 파티션에 나누는 작업을 수행합니다. 이때 같은 키를 가진 데이터는 반드시 같은 파티션으로 이동하게 됩니다. 하지만 정렬은 하지 않기 때문에, 그 안에서의 순서는 보장되지 않습니다.

spark.sql("SELECT * FROM my_table DISTRIBUTE BY col").show()
df.repartition("col").show()

CLUSTER BY

CLUSTER BYDISTRIBUTE BYSORT BY를 하나의 구문으로 결합한 키워드입니다. 지정한 컬럼을 기준으로 데이터를 파티셔닝하고, 각 파티션 내부에서는 해당 컬럼 기준으로 정렬까지 수행합니다. 내부적으로는 DISTRIBUTE BY col SORT BY col과 동일하게 작동합니다.

spark.sql("SELECT * FROM my_table CLUSTER BY col").show()
spark.sql("SELECT * FROM my_table DISTRIBUTE BY col SORT BY col").show()
df.repartition("col").sortWithinPartitions("col").show()

References