SQL (Spark SQL)

SQL (Spark SQL)

Spark SQL은 구조화된 데이터 처리를 위한 Spark 모듈이에요. 기본 Spark RDD API와 달리, Spark SQL이 제공하는 인터페이스는 데이터의 구조와 수행되는 연산의 구조에 대한 더 많은 정보를 Spark에 알려줘요. 내부적으로 Spark SQL은 이 추가 정보를 활용해 추가 최적화를 수행합니다. Spark SQL과 상호작용하는 방법은 여러 가지가 있어요 — SQL과 Dataset API가 대표적이죠. 결과를 계산할 때는 어떤 API나 언어로 연산을 표현했는지와 무관하게 동일한 실행 엔진이 사용됩니다. 이렇게 통일되어 있기 때문에 개발자는 주어진 변환을 가장 자연스럽게 표현할 수 있는 API를 골라 쉽게 오가며 쓸 수 있어요.

이 페이지의 모든 예제는 Spark 배포판에 포함된 샘플 데이터를 사용하며, spark-shell, pyspark 셸, 또는 sparkR 셸에서 실행할 수 있습니다.

SQL

Spark SQL의 쓰임새 중 하나는 SQL 쿼리를 실행하는 거예요. Spark SQL은 또한 기존 Hive 설치에서 데이터를 읽어오는 데에도 사용할 수 있습니다. 이 기능을 구성하는 방법에 대한 자세한 내용은 Hive Tables 섹션을 참고하세요. 다른 프로그래밍 언어 안에서 SQL을 실행하면 결과는 Dataset/DataFrame으로 반환됩니다. SQL 인터페이스는 명령줄 또는 JDBC/ODBC로도 사용할 수 있어요.

Datasets and DataFrames

Dataset은 데이터의 분산 컬렉션(distributed collection)이에요. Dataset은 Spark 1.6에서 추가된 새 인터페이스로, RDD의 장점(강한 타입, 강력한 람다 함수 사용 가능)과 Spark SQL의 최적화된 실행 엔진의 장점을 함께 제공합니다. Dataset은 JVM 객체로부터 생성할 수 있고, 이후 함수형 변환(map, flatMap, filter 등)으로 조작할 수 있어요. Dataset API는 ScalaJava에서 사용할 수 있습니다. Python은 Dataset API를 지원하지 않아요. 하지만 Python은 동적인 특성 덕분에 Dataset API의 장점 상당수를 이미 누릴 수 있습니다(예: row.columnName처럼 행의 필드에 이름으로 자연스럽게 접근할 수 있어요). R의 경우도 비슷합니다.

DataFrame이름 있는 컬럼으로 구성된 Dataset이에요. 개념적으로는 관계형 데이터베이스의 테이블이나 R/Python의 데이터 프레임과 같지만, 그 안쪽에서는 더 풍부한 최적화가 이루어집니다. DataFrame은 구조화된 데이터 파일, Hive의 테이블, 외부 데이터베이스, 기존 RDD 등 다양한 소스로부터 만들 수 있어요. DataFrame API는 Python, Scala, Java, R에서 사용할 수 있습니다. Scala와 Java에서 DataFrame은 Row들의 Dataset으로 표현됩니다. Scala API에서 DataFrame은 단순히 Dataset[Row]의 타입 별칭(type alias)일 뿐이에요. 반면 Java API에서는 Dataset<Row>를 써서 DataFrame을 표현해야 합니다.

이 문서 전반에 걸쳐 Scala/Java의 Row Dataset을 DataFrame이라고 자주 부를 거예요.