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처럼 여러 가지 변환을 자동으로 수행하므로, 비슷한 코드라면 대부분 손대지 않고 그대로 실행할 수 있습니다.