스파크 SQL과 아파치 하이브
- 스파크 SQL: 관계형 처리와 스파크의 함수형 프로그래밍 API를 통합하는 아파치 스파크의 기본 구성 요소
- 스파크 SQL을 사용하면 스파크 프로그래머는 더 빠른 성능 및 관계형 프로그래밍의 이점을 활용할 수 있을 뿐만 아니라 복잡한 분석 라이브러리를 호출할 수 있다.
사용자 정의 함수(user-defined function, UDF)
스파크 SQL UDF
# 큐브 함수 생성
def cubed(s):
return s*s*s
# UDF로 등록
spark.udf.register("cubed", cubed, LongType())
# 임시 뷰 생성
spark.range(1,9).createOrReplaceTempView("udf_test")
# udf 사용
spark.sql("select id, cubed(id) as id_cubed from udf_test").show()
스파크 SQL에서 평가 순서 및 null 검사
- 스파크 SQL(SQL, 데이터 프레임 API, 데이터세트 API 포함)은 하위 표현식의 평가 순서를 보장하지 않는다. 예를 들어 다음의 SQL문을 실행하고자 할 때, IS NOT NULL이 strlen(s) > 1보다 먼저 시행되는지의 여부가 보장되지 않는다. (이렇게 되면 null인 데이터에 대해 strlen(s) > 1를 검사하게 된다.
SELECT s FROM test1 WHERE s IS NOT NULL AND strlen(s) > 1
- 따라서 적절한 null 검사 수행을 위해서는 다음의 단계를 따른다.
- UDF자체가 null을 인식하도록 만들고 UDF 내부에서 null 검사를 수행한다.
- IF 또는 CASE WHEN 식을 사용하여 null 검사를 수행하고 조건 분기에서 UDF를 호출한다.
판다스 UDF로 pyspark UDF 속도 향상 및 배포
- pyspark UDF의 단점 중 하나는 scalar UDF보다 성능이 느리다는 것이다. 이는 pyspark UDF가 JVM과 python 사이의 데이터 이동을 필요로 하기 때문이다.
- 이를 위해 pandas UDF가 apache spark 2.3의 일부로 도입되어, pandas UDF는 apache arrow를 사용하여 데이터를 전송하고 판다스는 해당 데이터로 작업을 수행한다.
- apache arrow 형식에 포함된 데이터라면 이미 python 프로세스에서 사용가능 한 형식이므로 변형할 필요가 없다.