Apache Hive SQL 변환 가이드
이 문서에서는 마이그레이션을 계획하는 데 도움이 되도록 Apache Hive와 BigQuery 간 SQL 구문 유사점과 차이점을 자세히 설명합니다. SQL 스크립트를 일괄적으로 마이그레이션하려면 일괄 SQL 변환을 사용합니다. 임시 쿼리를 변환하려면 대화형 SQL 변환을 사용합니다.
Hive와 BigQuery의 SQL 요소가 서로 직접 매핑되지 않는 경우도 있습니다. 그러나 대부분의 경우 BigQuery는 이 문서의 예시와 같이 동일한 기능을 달성하는 데 도움이 되는 대체 요소를 Hive에 제공합니다.
이 문서는 엔터프라이즈 아키텍트, 데이터베이스 관리자, 애플리케이션 개발자, IT 보안 전문가를 대상으로 합니다. 여기에서는 사용자가 Hive에 익숙하다고 가정합니다.
데이터 유형
Hive와 BigQuery의 데이터 유형 시스템은 서로 다릅니다. MAP
및 UNION
등의 몇 가지 예외를 제외하면 대부분의 경우 Hive의 데이터 유형을 BigQuery 데이터 유형에 매핑할 수 있습니다. Hive는 BigQuery보다 더 암시적인 Cast 변환을 지원합니다. 따라서 일괄 SQL 번역기가 명시적 Cast 변환을 여러 개 삽입합니다.
Hive | BigQuery |
---|---|
TINYINT |
INT64 |
SMALLINT |
INT64 |
INT |
INT64 |
BIGINT |
INT64 |
DECIMAL |
NUMERIC |
FLOAT |
FLOAT64 |
DOUBLE |
FLOAT64 |
BOOLEAN |
BOOL |
STRING |
STRING |
VARCHAR |
STRING |
CHAR |
STRING |
BINARY |
BYTES |
DATE |
DATE |
- | DATETIME |
- | TIME |
TIMESTAMP |
DATETIME/TIMESTAMP |
INTERVAL |
- |
ARRAY |
ARRAY |
STRUCT |
STRUCT |
MAPS |
키 값이 있는 STRUCT (REPEAT 필드) |
UNION |
다른 유형의 STRUCT |
- | GEOGRAPHY |
- | JSON |
쿼리 구문
이 섹션에서는 Hive와 BigQuery 간 쿼리 구문의 차이점을 설명합니다.
SELECT
문
대부분의 Hive SELECT
문은 BigQuery와 호환됩니다. 아래 표에는 기타 다른 차이점 목록이 포함되어 있습니다.
케이스 | Hive | BigQuery |
---|---|---|
서브 쿼리 |
|
|
열 필터링 |
|
|
배열 분해 |
|
|
FROM
절
쿼리의 FROM
절은 데이터가 선택된 테이블 참조를 나열합니다. Hive에서 가능한 테이블 참조에는 테이블, 뷰, 서브 쿼리가 포함됩니다. BigQuery도 이러한 테이블 참조를 모두 지원합니다.
다음을 사용하여 FROM
절에서 BigQuery 테이블을 참조할 수 있습니다.
[project_id].[dataset_id].[table_name]
[dataset_id].[table_name]
[table_name]
BigQuery는 추가 테이블 참조도 지원합니다.
FOR SYSTEM_TIME AS OF
를 사용하는 테이블 정의 및 행의 이전 버전- 필드 경로 또는 데이터 유형 내의 필드로 확인되는 경로(예:
STRUCT
) - 평면화된 배열
비교 연산자
다음 표에서는 Hive에서 BigQuery로 연산자를 변환하는 방법을 자세히 설명합니다.
함수 또는 연산자 | Hive | BigQuery |
---|---|---|
- 단항 뺄셈 * 곱셈 / 나눗셈 + 덧셈 - 뺄셈
|
모든 숫자 유형 | 모든 숫자 유형. 나눗셈 연산 중에 오류를 방지하려면 |
~ 비트 NOT | 비트 OR & 비트 AND ^ 비트 XOR
|
불리언 데이터 유형 | 불리언 데이터 유형. |
왼쪽 시프트 |
|
|
오른쪽 시프트 |
|
|
모듈러스(나머지) |
X % Y 모든 숫자 유형 |
MOD(X, Y) |
정수 나눗셈 | 정밀도를 위한 A DIV B 및 A/B |
모든 숫자 유형. 참고: 나눗셈 연산 중에 오류를 방지하려면 |
단항 부정 | ! , NOT |
NOT |
동등 비교를 지원하는 유형 | 모든 기본 유형 | 모든 비교 가능 유형 및 STRUCT .
|
a <=> b |
지원되지 않음. 다음으로 변환:
|
|
a <> b |
지원되지 않음. 다음으로 변환:
|
|
관계 연산자( =, ==, !=, <, >, >= ) |
모든 기본 유형 | 모든 비교 가능 유형. |
문자열 비교 | RLIKE , REGEXP
|
REGEXP_CONTAINS 기본 제공 함수. 정규 표현식 패턴에 BigQuery 문자열 함수용 정규식 구문을 사용합니다. |
[NOT] LIKE, [NOT] BETWEEN, IS [NOT] NULL |
A [NOT] BETWEEN B AND C, A IS [NOT] (TRUE|FALSE), A [NOT] LIKE B
|
Hive와 동일합니다. 또한 BigQuery는 IN 연산자도 지원합니다. |
JOIN 조건
Hive와 BigQuery 모두 다음 유형의 조인을 지원합니다.
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
CROSS JOIN
과 이에 상응하는 암시적 쉼표 교차 조인
자세한 내용은 조인 연산 및 Hive 조인을 참조하세요.
유형 변환 및 Cast 변환
다음 표에서는 Hive에서 BigQuery로 함수를 변환하는 방법을 자세히 설명합니다.
함수 또는 연산자 | Hive | BigQuery |
---|---|---|
Cast 변환 | 변환에 실패하면 `NULL`이 반환됩니다. | Hive와 동일한 구문입니다. BigQuery 유형 변환 규칙에 대한 자세한 내용은 변환 규칙을 참조하세요. 변환에 실패하면 오류가 표시됩니다. Hive와 동일한 동작을 수행하려면 |
SAFE 함수 호출 |
함수 호출에 SAFE 프리픽스를 사용하면 함수는 실패를 보고하는 대신 NULL 을 반환합니다. 예를 들어 SAFE.SUBSTR('foo', 0, -2) AS safe_output; 은 NULL 을 반환합니다.
참고: 오류 없이 안전하게 Cast 변환하려면 |
암시적 변환 유형
BigQuery로 마이그레이션할 때는 BigQuery가 암시적으로 변환하는 다음 데이터 유형을 제외한 대부분의 Hive 암시적 변환을 BigQuery의 명시적 변환으로 변환해야 합니다.
BigQuery 유형 | 변경 BigQuery 유형 |
---|---|
INT64 |
FLOAT64 , NUMERIC , BIGNUMERIC |
BIGNUMERIC |
FLOAT64 |
NUMERIC |
BIGNUMERIC , FLOAT64 |
BigQuery는 다음 리터럴에도 암시적 변환을 수행합니다.
BigQuery 유형 | 변경 BigQuery 유형 |
---|---|
STRING 리터럴(예: "2008-12-25" ) |
DATE |
STRING 리터럴(예: "2008-12-25 15:30:00" ) |
TIMESTAMP |
STRING 리터럴(예: "2008-12-25T07:30:00" ) |
DATETIME |
STRING 리터럴(예: "15:30:00" ) |
TIME |
명시적 변환 유형
BigQuery가 암시적으로 변환하지 않는 Hive 데이터 유형을 변환하려면 BigQuery CAST(expression AS type)
함수를 사용하거나 DATE
및 TIMESTAMP
변환 함수 중 하나를 사용합니다.
함수
이 섹션에서는 Hive 및 BigQuery에서 사용되는 일반적인 함수를 설명합니다.
집계 함수
다음 표에서는 일반적인 Hive 집계, 통계 집계, 근사치 집계 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Hive | BigQuery |
---|---|
count(DISTINCT expr[, expr...])
|
count(DISTINCT expr[, expr...])
|
percentile_approx(DOUBLE col, array(p1 [, p2]...) [, B]) WITHIN GROUP (ORDER BY expression)
|
APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))] BigQuery는 Hive가 정의하는 나머지 인수를 지원하지 않습니다. |
AVG
|
AVG
|
X | Y
|
BIT_OR / X | Y
|
X ^ Y
|
BIT_XOR / X ^ Y
|
X & Y
|
BIT_AND / X & Y
|
COUNT
|
COUNT
|
COLLECT_SET(col), \
COLLECT_LIST(col )
|
ARRAY_AGG(col)
|
COUNT
|
COUNT
|
MAX
|
MAX
|
MIN
|
MIN
|
REGR_AVGX
|
AVG(
|
REGR_AVGY
|
AVG(
|
REGR_COUNT
|
SUM(
|
REGR_INTERCEPT
|
AVG(dep_var_expr)
|
REGR_R2
|
(COUNT(dep_var_expr) *
|
REGR_SLOPE
|
COVAR_SAMP(ind_var_expr,
|
REGR_SXX
|
SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
|
REGR_SXY
|
SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
|
REGR_SYY
|
SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
|
ROLLUP
|
ROLLUP
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
CONCAT_WS
|
STRING_AGG
|
분석 함수
다음 표에서는 일반적인 Hive 분석 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Hive | BigQuery |
---|---|
AVG
|
AVG
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
CUME_DIST
|
CUME_DIST
|
DENSE_RANK
|
DENSE_RANK
|
FIRST_VALUE
|
FIRST_VALUE
|
LAST_VALUE
|
LAST_VALUE
|
LAG
|
LAG
|
LEAD
|
LEAD
|
COLLECT_LIST, \
COLLECT_SET
|
ARRAY_AGG
ARRAY_CONCAT_AGG
|
MAX
|
MAX
|
MIN
|
MIN
|
NTILE
|
NTILE(constant_integer_expression)
|
PERCENT_RANK
|
PERCENT_RANK
|
RANK ()
|
RANK
|
ROW_NUMBER
|
ROW_NUMBER
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
VARIANCE
|
VARIANCE ()
|
WIDTH_BUCKET
|
사용자 정의 함수(UDF)를 사용할 수 있습니다. |
날짜 및 시간 함수
다음 표에서는 일반적인 Hive 날짜 및 시간 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
DATE_ADD
|
DATE_ADD(date_expression, INTERVAL int64_expression date_part)
|
DATE_SUB
|
DATE_SUB(date_expression, INTERVAL int64_expression date_part)
|
CURRENT_DATE
|
CURRENT_DATE
|
CURRENT_TIME
|
CURRENT_TIME
|
CURRENT_TIMESTAMP
|
값에 시간대가 없고 Hive의 CURRENT_TIMESTAMP \ CURRENT_TIMESTAMP 와 동의어인 CURRENT_DATETIME 이 권장됩니다.
|
EXTRACT(field FROM source)
|
EXTRACT(part FROM datetime_expression)
|
LAST_DAY
|
DATE_SUB( DATE_TRUNC( DATE_ADD(
|
MONTHS_BETWEEN
|
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEXT_DAY
|
DATE_ADD(
|
TO_DATE
|
PARSE_DATE
|
FROM_UNIXTIME
|
UNIX_SECONDS
|
FROM_UNIXTIMESTAMP
|
FORMAT_TIMESTAMP
|
YEAR \
QUARTER \
MONTH \
HOUR \
MINUTE \
SECOND \
WEEKOFYEAR
|
EXTRACT
|
DATEDIFF
|
DATE_DIFF
|
BigQuery는 다음과 같은 날짜 및 시간 함수를 추가로 제공합니다.
문자열 함수
다음 표에서는 Hive 문자열 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Hive | BigQuery |
---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
HEX
|
TO_HEX
|
LENGTH
|
CHAR_LENGTH
|
LENGTH
|
CHARACTER_LENGTH
|
CHR
|
CODE_POINTS_TO_STRING
|
CONCAT
|
CONCAT
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
REGEXP_EXTRACT
|
REGEXP_EXTRACT
|
REGEXP_REPLACE
|
REGEXP_REPLACE
|
REPLACE
|
REPLACE
|
REVERSE
|
REVERSE
|
RPAD
|
RPAD
|
RTRIM
|
RTRIM
|
SOUNDEX
|
SOUNDEX
|
SPLIT
|
SPLIT(instring, delimiter)[ORDINAL(tokennum)]
|
SUBSTR, \
SUBSTRING
|
SUBSTR
|
TRANSLATE
|
TRANSLATE
|
LTRIM
|
LTRIM
|
RTRIM
|
RTRIM
|
TRIM
|
TRIM
|
UPPER
|
UPPER
|
BigQuery는 다음과 같은 문자열 함수를 추가로 제공합니다.
수학 함수
다음 표에서 Hive 수학 함수와 이에 상응하는 BigQuery 함수 간의 매핑을 확인할 수 있습니다.
Hive | BigQuery |
---|---|
ABS
|
ABS
|
ACOS
|
ACOS
|
ASIN
|
ASIN
|
ATAN
|
ATAN
|
CEIL
|
CEIL
|
CEILING
|
CEILING
|
COS
|
COS
|
FLOOR
|
FLOOR
|
GREATEST
|
GREATEST
|
LEAST
|
LEAST
|
LN
|
LN
|
LNNVL
|
ISNULL 와 함께 사용합니다.
|
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER
|
POWER, POW
|
RAND
|
RAND
|
ROUND
|
ROUND
|
SIGN
|
SIGN
|
SIN
|
SIN
|
SQRT
|
SQRT
|
HASH
|
FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP
|
TAN
|
TAN
|
TRUNC
|
TRUNC
|
NVL
|
IFNULL(expr, 0), COALESCE(exp, 0)
|
BigQuery는 다음과 같은 수학 함수를 추가로 제공합니다.
논리 및 조건부 함수
다음 표에서는 Hive 논리 및 조건부 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Hive | BigQuery |
---|---|
CASE
|
CASE
|
COALESCE
|
COALESCE
|
NVL
|
IFNULL(expr, 0), COALESCE(exp, 0)
|
NULLIF
|
NULLIF
|
IF
|
IF(expr, true_result, else_result)
|
ISNULL
|
IS NULL
|
ISNOTNULL
|
IS NOT NULL
|
NULLIF
|
NULLIF
|
UDF 및 UDAF
BigQuery는 UDF를 지원하지만 사용자 정의 집계 함수(UDAF)는 지원하지 않습니다.
DML 구문
이 섹션에서는 Hive와 BigQuery 간의 DML(Data Manipulation Language) 구문 차이점을 설명합니다.
INSERT
문
대부분의 Hive INSERT
문은 BigQuery와 호환됩니다. 다음 표에는 예외 사항이 나와 있습니다.
Hive | BigQuery |
---|---|
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
|
INSERT INTO table (...) VALUES (...);
참고: BigQuery에서는 대상 테이블의 모든 열 값이 서수 위치에 따라 오름차순으로 포함된 경우에만 |
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
|
BigQuery는 삽입-덮어쓰기 작업을 지원하지 않습니다.
이 Hive 구문을 TRUNCATE 및 INSERT 문으로 마이그레이션할 수 있습니다.
|
BigQuery에는 하루에 실행 가능한 DML 문 수를 제한하는 DML 할당량이 적용됩니다. 할당량을 최대한 활용하려면 다음 방법을 사용해 보세요.
INSERT
작업마다 행을 하나씩 사용하는 대신 여러 행을 단일INSERT
문으로 결합합니다.MERGE
문을 사용하여 여러 DML 문(INSERT
포함)을 결합합니다.CREATE TABLE ... AS SELECT
를 사용하여 새 테이블을 만들고 값을 채웁니다.
UPDATE
문
대부분의 Hive UPDATE
문은 BigQuery와 호환됩니다. 다음 표에는 예외 사항이 나와 있습니다.
Hive | BigQuery |
---|---|
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
|
UPDATE table
참고: BigQuery의 모든 |
DELETE
및 TRUNCATE
문
DELETE
또는 TRUNCATE
문을 사용하면 테이블 스키마 또는 색인에 영향을 주지 않고 테이블에서 행을 삭제할 수 있습니다.
BigQuery의 DELETE
문에는 WHERE
절이 있어야 합니다.
BigQuery의 DELETE
에 대한 자세한 내용은 DELETE
예시를 참조하세요.
Hive | BigQuery |
---|---|
DELETE FROM tablename [WHERE expression]
|
DELETE FROM table_name
WHERE TRUE
BigQuery |
TRUNCATE [TABLE] table_name [PARTITION partition_spec];
|
TRUNCATE TABLE [[project_name.]dataset_name.]table_name
|
MERGE
문
MERGE
문은 INSERT
, UPDATE
, DELETE
작업을 단일 upsert 문으로 결합하여 작업을 수행할 수 있습니다. MERGE
작업은 각 대상 행에 대해 최대 1개의 소스 행과 일치해야 합니다.
Hive | BigQuery |
---|---|
MERGE INTO
ON
|
MERGE target
USING source
참고: 업데이트해야 하는 모든 열을 나열해야 합니다. |
ALTER
문
다음 표에서는 Hive에서 BigQuery로 CREATE VIEW
문을 변환하는 방법을 자세히 설명합니다.
기능 | Hive | BigQuery |
---|---|---|
Rename table
|
ALTER TABLE table_name RENAME TO new_table_name;
|
지원되지 않음. 해결 방법은 대상 테이블에 붙일 이름으로 복사 작업을 사용한 후 이전 테이블을 삭제하는 것입니다.
|
Table properties
|
ALTER TABLE table_name SET TBLPROPERTIES table_properties;
|
{ALTER TABLE | ALTER TABLE IF EXISTS}
|
SerDe properties (Serialize and deserialize)
|
ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];
|
직렬화 및 역직렬화는 BigQuery 서비스가 관리하며 사용자가 구성할 수 없습니다.
BigQuery가 CSV, JSON, AVRO, PARQUET, ORC 파일에서 데이터를 읽게 하는 방법은 Cloud Storage 외부 테이블 만들기를 참조하세요. CSV, JSON, AVRO, PARQUET 내보내기 형식을 지원합니다. 자세한 내용은 내보내기 형식 및 압축 유형을 참조하세요. |
Table storage properties
|
ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
INTO num_buckets BUCKETS;
|
ALTER 문에 지원되지 않습니다.
|
Skewed table
|
Skewed:
ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...)
ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...]
|
성능 쿼리용 스토리지 균형 조정은 BigQuery 서비스가 관리하며 직접 구성할 수 없습니다. |
Table constraints
|
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;
|
ALTER TABLE [[project_name.]dataset_name.]table_name ADD [CONSTRAINT [IF NOT EXISTS] [constraint_name]] constraint NOT ENFORCED; ALTER TABLE [[project_name.]dataset_name.]table_name ADD PRIMARY KEY(column_list) NOT ENFORCED;
자세한 내용은 |
Add partition
|
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
|
지원되지 않음. 파티션 열에 새 값이 있는 데이터가 로드되면 필요에 따라 파티션이 추가됩니다. 자세한 내용은 파티션을 나눈 테이블 관리를 참조하세요. |
Rename partition
|
ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
|
지원되지 않음. |
Exchange partition
|
-- Move partition from table_name_1 to table_name_2
|
지원되지 않음. |
Recover partition
|
MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
|
지원되지 않음. |
Drop partition
|
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
[IGNORE PROTECTION] [PURGE];
|
다음 메서드를 사용하여 지원됩니다.
자세한 내용은 파티션 삭제를 참조하세요. |
(Un)Archive partition
|
ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;
|
지원되지 않음. |
Table and partition file format
|
ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;
|
지원되지 않음. |
Table and partition location
|
ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";
|
지원되지 않음. |
Table and partition touch
|
ALTER TABLE table_name TOUCH [PARTITION partition_spec];
|
지원되지 않음. |
Table and partition protection
|
ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP [CASCADE];
|
지원되지 않음. |
Table and partition compact
|
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])]
COMPACT 'compaction_type'[AND WAIT]
|
지원되지 않음. |
Table and artition concatenate
|
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE;
|
지원되지 않음. |
Table and partition columns
|
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] UPDATE COLUMNS;
|
ALTER TABLE 문에 지원되지 않습니다.
|
Column name, type, position, and comment
|
ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
[COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];
|
지원되지 않음. |
DDL 구문
이 섹션에서는 Hive와 BigQuery 간의 데이터 정의 언어(DDL) 구문 차이점을 설명합니다.
CREATE TABLE
및 DROP TABLE
문
다음 표에서는 Hive에서 BigQuery로 CREATE TABLE
문을 변환하는 방법을 자세히 설명합니다.
유형 | Hive | BigQuery |
---|---|---|
관리형 테이블 | create table table_name (
|
CREATE TABLE `myproject`.mydataset.table_name (
|
파티션을 나눈 테이블 | create table table_name (
|
CREATE TABLE `myproject`.mydataset.table_name (
|
Create table as select (CTAS)
|
CREATE TABLE new_key_value_store
|
CREATE TABLE `myproject`.mydataset.new_key_value_store
날짜별로 파티션을 나눌 때는 다음을 주석 처리 삭제합니다.
날짜별로 파티션을 나눌 때는 다음을 주석 처리 삭제합니다. 테이블 파티션을 나눌 때는
|
Create Table Like:
|
CREATE TABLE empty_key_value_store
|
지원되지 않음. |
버킷팅된 정렬 테이블(BigQuery 용어로는 클러스터링) | CREATE TABLE page_view(
|
CREATE TABLE `myproject` mydataset.page_view (
자세한 내용은 클러스터링된 테이블 만들기 및 사용을 참조하세요. |
왜곡된 테이블(하나 이상의 열에 왜곡된 값이 있는 테이블) | CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
|
지원되지 않음. |
임시 테이블 | CREATE TEMPORARY TABLE list_bucket_multiple (
|
다음과 같이 만료 시간을 사용하여 구현할 수 있습니다.
|
트랜잭션 테이블 | CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC;
|
BigQuery의 모든 테이블 수정은 ACID(원자성, 일관성, 격리성, 내구성)를 준수합니다. |
테이블 삭제 | DROP TABLE [IF EXISTS] table_name [PURGE];
|
{DROP TABLE | DROP TABLE IF EXISTS}
|
테이블 자르기 | TRUNCATE TABLE table_name [PARTITION partition_spec];
|
지원되지 않음. 다음과 같은 해결 방법을 사용할 수 있습니다.
참고: 특정 파티션을 잘라낼 수도 있습니다. 자세한 내용은 파티션 삭제를 참조하세요. |
CREATE EXTERNAL TABLE
및 DROP EXTERNAL TABLE
문
BigQuery의 외부 테이블 지원은 외부 데이터 소스 소개를 참조하세요.
CREATE VIEW
및 DROP VIEW
문
다음 표에서는 Hive에서 BigQuery로 CREATE VIEW
문을 변환하는 방법을 자세히 설명합니다.
Hive | BigQuery |
---|---|
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
|
{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}
|
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name
|
CREATE MATERIALIZED VIEW [IF NOT EXISTS] \
[project_id].[dataset_id].materialized_view_name
|
CREATE FUNCTION
및 DROP FUNCTION
문
다음 표에서는 Hive에서 BigQuery로 저장 프로시저를 변환하는 방법을 자세히 설명합니다.
Hive | BigQuery |
---|---|
CREATE TEMPORARY FUNCTION function_name AS class_name;
|
CREATE { TEMPORARY | TEMP } FUNCTION function_name ([named_parameter[, ...]])
|
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
|
지원되지 않음. |
CREATE FUNCTION [db_name.]function_name AS class_name
|
허용 목록에 있는 프로젝트에서 알파 기능으로 지원됩니다.
|
DROP FUNCTION [IF EXISTS] function_name;
|
DROP FUNCTION [ IF EXISTS ] function_name
|
RELOAD FUNCTION;
|
지원되지 않음. |
CREATE MACRO
및 DROP MACRO
문
다음 표에서는 변수 선언 및 할당을 사용하여 매크로 작성에 사용되는 절차적 SQL 문을 Hive에서 BigQuery로 변환하는 방법을 자세히 설명합니다.
Hive | BigQuery |
---|---|
CREATE TEMPORARY MACRO macro_name([col_name col_type, ...]) expression;
|
지원되지 않음. 경우에 따라 UDF로 대체할 수 있습니다. |
DROP TEMPORARY MACRO [IF EXISTS] macro_name;
|
지원되지 않음. |
오류 코드 및 메시지
Hive 오류 코드와 BigQuery 오류 코드는 서로 다릅니다. 애플리케이션 로직에서 오류를 포착하는 경우 BigQuery가 동일한 오류 코드를 반환하지 않으므로 오류의 원인을 제거하세요.
BigQuery에서는 일반적으로 INFORMATION_SCHEMA 뷰 또는감사 로깅을 사용하여 오류를 조사합니다.
일관성 보장 및 트랜잭션 격리
Hive와 BigQuery 모두 ACID 시맨틱스를 사용하는 트랜잭션을 지원합니다. Hive 3에서는 트랜잭션이 기본적으로 사용 설정됩니다.
ACID 시맨틱스
Hive는 스냅샷 격리를 지원합니다. 쿼리를 실행하면 데이터베이스의 일관된 스냅샷이 쿼리에 제공되며 실행 종료 시점까지 해당 스냅샷이 사용됩니다. Hive는 행 수준에서 완전한 ACID 시맨틱스를 제공하므로 한 애플리케이션이 행을 추가하고 다른 애플리케이션이 같은 파티션에서 읽을 때 서로 간섭이 발생하지 않습니다.
BigQuery는 쿼리가 시작되기 전에 마지막으로 커밋된 데이터를 쿼리가 읽는 스냅샷 격리를 사용하여 최적의 동시 실행 제어(첫 번째 성공 커밋)를 제공합니다. 이 접근 방법은 각 행과 변형 및 같은 DML 문에 포함된 여러 행에 걸쳐 동일한 수준의 일관성을 보장하면서 교착 상태를 방지합니다. 동일한 테이블에 여러 DML 업데이트가 수행되면 BigQuery는 최악 동시 실행 제어로 전환됩니다. 여러 로드 작업이 독립적으로 실행되면서 테이블을 추가할 수 있지만 BigQuery는 명시적 트랜잭션 경계 또는 세션을 제공하지 않습니다.
트랜잭션
Hive는 멀티 문 트랜잭션을 지원하지 않습니다. BEGIN
, COMMIT
, ROLLBACK
문을 지원하지 않습니다. Hive에서는 모든 언어 작업이 자동으로 커밋됩니다.
BigQuery는 단일 쿼리 내에서 또는 세션 사용 시 여러 쿼리 간에 멀티 문 트랜잭션을 지원합니다. 멀티 문 트랜잭션을 사용하면 하나 이상의 테이블에서 행을 삽입하거나 삭제하고 변경사항을 커밋하거나 롤백하는 등의 변형 작업을 수행할 수 있습니다. 자세한 내용은 멀티 문 트랜잭션을 참조하세요.