Hive에서의 즉석 SQL 변환

Hive에서의 즉석 SQL 변환 (On-the-Fly SQL Conversion in Hive)

HPL/SQL은 여러 절차적 방언(dialect)을 지원해서 기존 코드를 수정 없이 재사용할 수 있게 해 줘요. 하지만 모든 문장이 HPL/SQL에 의해 실행되는 것은 아니고, 일부 문장은 반드시 HiveServer가 실행해야 합니다.

출처: 문서

본문

다음 예제를 살펴볼까요.

IF code = 'A' THEN
  CREATE TABLE dept 
  (
    deptno NUMBER(2,0),
    dname  NUMBER(14),
    loc    VARCHAR2(13),
    CONSTRAINT pk_dept PRIMARY KEY (deptno)
  );
END IF;

이 예제에서 IF 문은 HPL/SQL 자체가 실행해요. code 변수의 값을 확인해서 'A'와 같으면 HPL/SQL이 CREATE TABLE 문을 실행합니다.

HPL/SQL은 CREATE TABLE을 실행할 수 없기 때문에, 이 문장은 물리적 영구 테이블을 만들어 다른 세션에서 접근 가능하게 하기 위해 반드시 HiveServer로 보내야 해요.

그런데 위 CREATE TABLE의 구문은 Hive에 맞지 않아요. NUMBER, VARCHAR2 같은 데이터 타입과 제약조건(constraint)을 사용하고 있죠.

이때 **즉석 SQL 변환(on-the-fly SQL conversion)**이 등장합니다. HPL/SQL은 CREATE TABLE 문을 Hive로 보내기 전에 다음과 같이 변환해요.

CREATE TABLE dept 
(
  deptno DECIMAL(2,0),
  dname  DECIMAL(14),
  loc    STRING
);

데이터 타입 (Data Types)

CREATE TABLE 문에서의 데이터 타입 변환:

Source Hive SQL
VARCHAR2 STRING
NUMBER DECIMAL

자세한 내용은 데이터 타입 변환(Data Type Conversion)을 참고하세요.

언어 요소와 연산자 (Language Elements and Operators)

SQL DDL/DML 문에서 언어 요소와 연산자의 변환:

Source Description Hive SQL
"identifier", [identifier] Identifier identifier
dbo, [dbo] Schema name Removed
expr expr2

내장 SQL 함수 (Built-In SQL Functions)

실행 가능한 SQL 문에서 내장 SQL 함수의 변환:

Source Hive SQL
CURRENT_DATE TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))
CURRENT DATE TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))
CURRENT_TIMESTAMP FROM_UNIXTIME(UNIX_TIMESTAMP())
CURRENT TIMESTAMP FROM_UNIXTIME(UNIX_TIMESTAMP())

SQL SELECT 문 (SQL SELECT Statement)

SQL SELECT 문의 변환:

Source Description Hive SQL
SELECT TOP n … FROM … Row limit SELECT … FROM … LIMIT n
FROM TABLE (VALUES … ) clause Row constructor SELECT UNION ALL subquery

자세한 내용은 SELECT 문을 참고하세요.

SQL 문 (SQL Statements)

SQL 문의 변환:

Source Description Hive SQL
SET CURRENT SCHEMA = name USE name

더 알아보기 (Learn more)

HPL/SQL은 다른 DB(SQL Server, Oracle 등)에서 쓰던 코드를 Hive로 이식할 때 유용해요. NUMBER → DECIMAL, VARCHAR2 → STRING, || → CONCAT처럼 여러 가지 변환을 자동으로 수행하므로, 비슷한 코드라면 대부분 손대지 않고 그대로 실행할 수 있습니다.