PySpark에서 Dataset을 지원하지 않는 이유
우선, PySpark에서는 DataSet 자료형을 지원하지 않는다. Java나 Scala에서만 지원을 한다. 그 이유느 DataSet은 런타임이 아닌 컴파일 타임에 타입을 체킹하기 때문이다. 파이썬이라는 언어는 변수를 정의할 때 타입을 정의하지 않는다. 값을 할당하면서 타입이 정해진다. 그 예시로 아래 코드를 보자.
a = 10
a = "만들어진 변수 a에 문자열 값을 새로 할당합니다"
이 코드가 문제가 생기지 않는 것은 파이썬 런타임에 값을 할당하면서 변수의 타입을 새롭게 쓸 수 있기 때문이다. 프로그래밍의 자유도가 높지만 반대로 자바나 스칼라처럼 컴파일 타임에 데이터 타입을 체킹하기 어려운 점이 있다. 파이스파크에서 Dataset을 지원하지 못하는 이유이기도 하다.
DataSet
- Spark 2.0에서 DataFrame(1.6 버전 도입)과 상반된 Dataset 도입
- 파이썬에서는 둘의 경계가 모호하다. 이유는 앞서 설명했는 파이썬에서는 모든 것이 동적으로 입력되기 때문이다.
- DataFrame은 행 객체의 Dataset라는 것을 이해해야 한다. Dataset이 더 포괄적인 용어로써, 안에는 DataFrame에서 사용하는 행 객체를 포함해 어떤 유형의 정보도 포함 가능하다. 이는 스파크가 데이터의 구조에 앞서 더 많은 정보를 가져올 수 있는 방법이기도 하다. 이렇게 되면 에러를 런타임까지 기다리는 대신 컴파일 타임에 미리 잡아낼 수 있음 (DataSet의 강력한 기능)
- 스크립트 내에 SQL 쿼리를 사용해 추가적인 최적화 도모도 가능하다. 이는 DataFrame과 동일하다.
- 파이썬에서 큰 차이는 없으나, 자바나 스칼라에서는 더 DataFrame 보다 더욱 활용도가 높다.
Shell Access
- SparkSQL을 사용해 DB 서버를 연결해 데이터를 소싱 할 수 있고, 쿼리도 사용 가능하다. 또한 하둡 환경에서는 Hive도 지원하고 있다.
- Spark에 내재된 'sbin/start-thriftserver.sh'를 시작하면 JDBC/ODBC를 통해 연결 가능하다.
- 기본 포트로 10000을 Listening 한다. bin/beeline -u jdbc:hive2://localhost:10000 을 통해 접속 가능하다.
- 새로운 테이블을 만들거나, hiveCtx.cacheTable(“tableName”)를 통해 기존 캐쉬된 테이블을 쿼리 가능하다.
SparkSQL 확장성
User-defined functions(UDF's)
SQL에 플러그인하는 사용자 정의 함수(UDF)를 만들어 SQL 쿼리에 사용 가능하다.
from pyspark import SparkContext
from pyspark.sql import IntegerType
sc = SparkContext(conf)
hiveCtx = HiveContext(sc)
hiveCtx.registerFunction("square", lambda x: x*x, IntegerType())
df = hiveCtx.sql("SELECT square('somNumericField') FROM tableName")
기억할 점
Spark의 다양한 하부 조직에 사이에 작용하는 통일된 API이다.
- Spark 2.0 의 머신러닝 라이브러리(MLLib)나 스트리밍 라이브러리(Spark Streaming)등에서 DataSet을 기반으로 한 API 사용하고 있다.
- 다양한 시스템 사이에서 데이터를 전달하는 데, 공통분모의 역할을 수행한다.
- DataSet을 사용함으로써, 성능적인 이득과 Spark 위에 구축된 다양한 기술들을 더 쉽게 사용하고 이들을 다양한 방식으로 혼합하여 사용할 수 있게 만든다.
'Data Engineering > PySpark' 카테고리의 다른 글
[Spark] Local Mode Executor에 대한 고찰 (0) | 2023.07.17 |
---|---|
[Spark] 분산 파일 시스템에서의 데이터 지역성 (0) | 2023.07.05 |