Apache Hive SQL 変換ガイド

このドキュメントでは、移行の計画に役立つ Apache Hive と BigQuery の間の SQL 構文の類似点と相違点について詳しく説明します。SQL スクリプトを一括で移行するには、バッチ SQL 変換を使用します。アドホック クエリを変換するには、インタラクティブ SQL 変換を使用します。

Hive と BigQuery の SQL 要素間に直接の対応関係がない場合もあります。ただし、多くの場合は、このドキュメントの例に示されているように、BigQuery には、Hive と同じ機能を実現する代わりの要素が用意されています。

このドキュメントは、エンタープライズ アーキテクト、データベース管理者、アプリケーション デベロッパー、IT セキュリティ スペシャリストを対象としています。また、Hive を詳しく知っていることを前提としています。

データ型

Hive と BigQuery では、データ型のシステムが異なります。ほとんどの場合、Hive のデータ型は BigQuery のデータ型にマッピングできますが、MAPUNION などのいくつかの例外があります。Hive は、BigQuery よりも暗黙的な型キャストをサポートしています。その結果、バッチ SQL トランスレータは多数の明示的なキャストを挿入します。

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 キー値(REPEAT フィールド)付きの STRUCT
UNION さまざまな型の STRUCT
- GEOGRAPHY
- JSON

クエリ構文

ここでは、Hive と BigQuery のクエリ構文の違いについて説明します。

SELECT ステートメント

Hive の SELECT ステートメントの大部分は、BigQuery と互換性があります。次の表に小さな違いの一覧を示します。

Case Hive BigQuery
サブクエリ

SELECT * FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
) tmp_table;

SELECT * FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
);

列のフィルタリング

SET hive.support.quoted.identifiers=none;
SELECT `(col2|col3)?+.+` FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
) tmp_table;

SELECT * EXCEPT(col2,col3) FROM (
SELECT 10 as col1, "test" as col2, "test" as col3
);

配列の展開

SELECT tmp_table.pageid, adid FROM (
SELECT 'test_value' pageid, Array(1,2,3) ad_id) tmp_table
LATERAL VIEW
explode(tmp_table.ad_id) adTable AS adid;

SELECT tmp_table.pageid, ad_id FROM (
SELECT 'test_value' pageid, [1,2,3] ad_id) tmp_table,
UNNEST(tmp_table.ad_id) ad_id;

FROM

クエリの FROM 句には、データの選択元となるテーブル参照が列挙されます。Hive で使用できるテーブル参照は、テーブル、ビュー、およびサブクエリです。BigQuery は、これらのテーブル参照もすべてサポートしています。

FROM 句で BigQuery テーブルを参照するには、以下を使用します。

  • [project_id].[dataset_id].[table_name]
  • [dataset_id].[table_name]
  • [table_name]

BigQuery は、その他のテーブル参照もサポートしています。

比較演算子

次の表では、Hive から BigQuery への演算子の変換に関する詳細を示します。

関数または演算子 Hive BigQuery
- 単項のマイナス
* 乗算
/ 除算
+ 加算
- 減算
すべての数値型 すべての数値型

除算中のエラーを防ぐには、SAFE_DIVIDE または IEEE_DIVIDE の使用を検討してください。

~ ビットごとの NOT
| ビットごとの OR
& ビットごとの AND
^ ビットごとの XOR
ブール値データ型 ブール値データ型
左シフト

shiftleft(TINYINT|SMALLINT|INT a, INT b)
shiftleft(BIGINT a, INT b)

<< 整数またはバイト

A << BAB は同じ型でなければなりません)

右シフト

shiftright(TINYINT|SMALLINT|INT a, INT b)
shiftright(BIGINT a, INT b)

>>整数またはバイト

A >> BAB は同じ型でなければなりません)

モジュロ(剰余) X % Y

すべての数値型

MOD(X, Y)
整数除算 A DIV BA/B(詳細な精度) すべての数値型

注: 除算中のエラーを防ぐには、SAFE_DIVIDE または IEEE_DIVIDE の使用を検討してください。

単項否定 !NOT NOT
等価比較をサポートする型 すべてのプリミティブ型 すべての比較可能な型と STRUCT
a <=> b サポート対象外以下に変換してください。

(a = b AND b IS NOT NULL OR a IS NULL)

a <> b サポート対象外以下に変換してください。

NOT (a = b AND b IS NOT NULL OR a IS NULL)

関係演算子( =, ==, !=, <, >, >= すべてのプリミティブ型 すべての互換性のある型
文字列の比較 RLIKEREGEXP 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 はどちらも、次の種類の JOIN をサポートしています。

詳細については、Join operationHive Joins をご覧ください。

型変換とキャスティング

次の表に、Hive から BigQuery への関数の変換に関する詳細を示しています。

関数または演算子 Hive BigQuery
型のキャスティング キャストが失敗すると、「NULL」が返されます。

Hive と同じ構文です。BigQuery の型変換ルールの詳細については、変換ルールをご覧ください。

キャストが失敗すると、エラーが表示されます。Hive と同じ動作を得るには、代わりに SAFE_CAST を使用します。

SAFE 関数の呼び出し 関数呼び出しの先頭に SAFE を付けると、エラーの報告ではなく、NULL が返されます。たとえば、SAFE.SUBSTR('foo', 0, -2) AS safe_output;NULL を返します。

注: エラーなしで安全にキャストする場合は、SAFE_CAST を使用します。

暗黙的に変換されるデータ型

BigQuery に移行する際は、BigQuery によって暗黙的に変換される以下のデータ型を除き、Hive の暗黙的変換のほとんどを BigQuery の明示的変換に変換する必要があります。

変換元の BigQuery データ型 変換先の BigQuery データ型
INT64 FLOAT64NUMERICBIGNUMERIC
BIGNUMERIC FLOAT64
NUMERIC BIGNUMERICFLOAT64

また、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(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, ind_var_expr)

)

REGR_AVGY AVG(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, dep_var_expr)

)

REGR_COUNT SUM(

IF(dep_var_expr is NULL

OR ind_var_expr is NULL,

NULL, 1)

)

REGR_INTERCEPT AVG(dep_var_expr)

- AVG(ind_var_expr)

* (COVAR_SAMP(ind_var_expr,dep_var_expr)

/ VARIANCE(ind_var_expr)

)

REGR_R2 (COUNT(dep_var_expr) *

SUM(ind_var_expr * dep_var_expr) -

SUM(dep_var_expr) * SUM(ind_var_expr))

/ SQRT(

(COUNT(ind_var_expr) *

SUM(POWER(ind_var_expr, 2)) *

POWER(SUM(ind_var_expr),2)) *

(COUNT(dep_var_expr) *

SUM(POWER(dep_var_expr, 2)) *

POWER(SUM(dep_var_expr), 2)))

REGR_SLOPE COVAR_SAMP(ind_var_expr,

dep_var_expr)

/ VARIANCE(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 CURRENT_DATETIME をおすすめします。この値はタイムゾーンに依存せず、Hive の CURRENT_TIMESTAMP \ CURRENT_TIMESTAMP と同義です。
EXTRACT(field FROM source) EXTRACT(part FROM datetime_expression)
LAST_DAY DATE_SUB( DATE_TRUNC( DATE_ADD(

date_expression, INTERVAL 1 MONTH

), MONTH ), INTERVAL 1 DAY)

MONTHS_BETWEEN DATE_DIFF(date_expression, date_expression, MONTH)
NEXT_DAY DATE_ADD(

DATE_TRUNC(

date_expression,

WEEK(day_value)

),

INTERVAL 1 WEEK

)

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)構文の違いについて説明します。

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 ステートメントで列名を省略できます。

INSERT OVERWRITE [LOCAL] DIRECTORY directory1

[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)

SELECT ... FROM ...

BigQuery は、挿入の上書きオペレーションをサポートしていません。この Hive 構文は、TRUNCATE ステートメントと INSERT ステートメントに移行できます。

BigQuery では、1 日に実行できる DML ステートメントの数を制限する DML 割り当てが課されています。割り当てを最大限に利用するには、次の方法を検討してください。

  • INSERT オペレーションごとに 1 行ではなく、1 つの 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

SET column = expression [,...]

[FROM ...]

WHERE TRUE

注: BigQuery のすべての UPDATE ステートメントには、WHERE キーワードと、その後に続く条件が必要です。

DELETE および TRUNCATE ステートメント

DELETE ステートメントや TRUNCATE ステートメントは、テーブル スキーマやインデックスに影響を与えることなくテーブルから行を削除するために使用できます。

BigQuery では、DELETE ステートメントには WHERE 句が必要です。BigQuery における DELETE の詳細については、DELETE の例をご覧ください。

Hive BigQuery
DELETE FROM tablename [WHERE expression] DELETE FROM table_name WHERE TRUE

BigQuery の DELETE ステートメントには、WHERE 句が必要です。

TRUNCATE [TABLE] table_name [PARTITION partition_spec]; TRUNCATE TABLE [[project_name.]dataset_name.]table_name

MERGE ステートメント

MERGE ステートメントは、INSERTUPDATE、および DELETE 操作を組み合わせて 1 つの「upsert」ステートメントにし、複数の操作を自動的に実行できます。MERGE オペレーションでは、ターゲット行ごとに最大 1 つのソース行を対応させる必要があります。

Hive BigQuery
MERGE INTO AS T USING AS S ON

WHEN MATCHED [AND ] THEN UPDATE SET

WHEN MATCHED [AND ] THEN DELETE

WHEN NOT MATCHED [AND ] THEN INSERT VALUES

MERGE target USING source

ON target.key = source.key

WHEN MATCHED AND source.filter = 'filter_exp' THEN

UPDATE SET

target.col1 = source.col1,

target.col2 = source.col2,

...

注: 更新が必要な列をすべて列挙する必要があります。

ALTER ステートメント

次の表では、Hive から BigQuery への CREATE VIEW ステートメントの変換に関する詳細を示します。

関数 Hive BigQuery
Rename table ALTER TABLE table_name RENAME TO new_table_name; サポート対象外対処方法としては、宛先テーブルとする名前を指定してコピージョブを使用した後、古いテーブルを削除します。

bq copy project.dataset.old_table project.dataset.new_table

bq rm --table project.dataset.old_table

Table properties ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:

: (property_name = property_value, property_name = property_value, ... )

Table Comment: ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

{ALTER TABLE | ALTER TABLE IF EXISTS}

table_name

SET OPTIONS(table_set_options_list)

SerDe properties (Serialize and deserialize) ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];

ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;

serde_properties:

: (property_name = property_value, property_name = property_value, ... )

シリアル化とシリアル化解除は 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), ...]

[STORED AS DIRECTORIES];

Not Skewed: ALTER TABLE table_name NOT SKEWED;

Not Stored as Directories: ALTER TABLE table_name NOT STORED AS DIRECTORIES;

Skewed Location: ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );

パフォーマンス クエリ用のストレージのバランシングは 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 table_name DROP CONSTRAINT constraint_name;

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;

詳細については、ALTER TABLE ADD PRIMARY KEY ステートメントをご覧ください。

Add partition ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

サポート対象外パーティション列に新しい値を持つデータが読み込まれると、必要に応じてパーティションが追加されます。

詳細については、パーティション分割テーブルの管理をご覧ください。

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

ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1; -- multiple partitions

ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;

サポート対象外
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];

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE;

サポート対象外
Table and partition compact ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] COMPACT 'compaction_type'[AND WAIT]

[WITH OVERWRITE TBLPROPERTIES ("property"="value" [, ...])];

サポート対象外
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 (

id int,

dtDontQuery string,

name string

)

CREATE TABLE `myproject`.mydataset.table_name (

id INT64,

dtDontQuery STRING,

name STRING

)

パーティション分割テーブル create table table_name (

id int,

dt string,

name string

)

partitioned by (date string)

CREATE TABLE `myproject`.mydataset.table_name (

id INT64,

dt DATE,

name STRING

)

PARTITION BY dt

OPTIONS(

partition_expiration_days=3,

description="a table partitioned by date_col"

)

Create table as select (CTAS) CREATE TABLE new_key_value_store

ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"

STORED AS RCFile

AS

SELECT (key % 1024) new_key, concat(key, value) key_value_pair, dt

FROM key_value_store

SORT BY new_key, key_value_pair;

CREATE TABLE `myproject`.mydataset.new_key_value_store

日付でパーティショニングする場合は、以下をコメント化解除します。

PARTITION BY dt

OPTIONS(

description="Table Description",

日付でパーティショニングする場合は、以下をコメント化解除します。テーブルが分割されている場合は、require_partition を使用することをおすすめします。

require_partition_filter=TRUE

) AS

SELECT (key % 1024) new_key, concat(key, value) key_value_pair, dt

FROM key_value_store

SORT BY new_key, key_value_pair'

Create Table Like:

CREATE TABLELIKE フォームを使用すると、既存のテーブル定義を正確にコピーできます。

CREATE TABLE empty_key_value_store

LIKE key_value_store [TBLPROPERTIES (property_name=property_value, ...)];

サポート対象外
バケットソート テーブル(BigQuery の用語ではクラスタ化テーブル) CREATE TABLE page_view(

viewTime INT,

userid BIGINT,

page_url STRING,

referrer_url STRING,

ip STRING COMMENT 'IP Address of the User'

)

COMMENT 'This is the page view table'

PARTITIONED BY(dt STRING, country STRING)

CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\001'

COLLECTION ITEMS TERMINATED BY '\002'

MAP KEYS TERMINATED BY '\003'

STORED AS SEQUENCEFILE;

CREATE TABLE `myproject` mydataset.page_view (

viewTime INT,

dt DATE,

userId BIGINT,

page_url STRING,

referrer_url STRING,

ip STRING OPTIONS (description="IP Address of the User")

)

PARTITION BY dt

CLUSTER BY userId

OPTIONS (

partition_expiration_days=3,

description="This is the page view table",

require_partition_filter=TRUE

)'

詳細については、クラスタ化テーブルの作成と使用をご覧ください。

スキュー テーブル(偏りのある値が 1 つ以上の列にあるテーブル) CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)

SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];

サポート対象外
一時テーブル CREATE TEMPORARY TABLE list_bucket_multiple (

col1 STRING,

col2 int,

col3 STRING);

これは、有効期限を使用して次のように実現できます。

CREATE TABLE mydataset.newtable

(

col1 STRING OPTIONS(description="An optional INTEGER field"),

col2 INT64,

col3 STRING

)

PARTITION BY DATE(_PARTITIONTIME)

OPTIONS(

expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",

partition_expiration_days=1,

description="a table that expires in 2020, with each partition living for 24 hours",

labels=[("org_unit", "development")]

)

トランザクション テーブル 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}

table_name

テーブルの切り捨て TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

サポート対象外次の対策を使用できます。

  • テーブルを削除し、同じスキーマでもう一度作成する。
  • 切り捨てオペレーションが特定のテーブルの一般的なユースケースである場合は、テーブルの書き込み処理を WRITE_TRUNCATE に設定する。
  • CREATE OR REPLACE TABLE ステートメントを使用します。
  • DELETE from table_name WHERE 1=1 ステートメントを使用します。

注: 特定のパーティションを切り詰めることもできます。詳細については、パーティションを削除するをご覧ください。

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], ...) ]

[COMMENT view_comment]

[TBLPROPERTIES (property_name = property_value, ...)]

AS SELECT ...;

{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}

view_name

[OPTIONS(view_option_list)]

AS query_expression

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name

[DISABLE REWRITE]

[COMMENT materialized_view_comment]

[PARTITIONED ON (col_name, ...)]

[

[ROW FORMAT row_format]

[STORED AS file_format]

| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]

]

[LOCATION hdfs_path]

[TBLPROPERTIES (property_name=property_value, ...)]

AS

;

CREATE MATERIALIZED VIEW [IF NOT EXISTS] \ [project_id].[dataset_id].materialized_view_name

-- cannot disable rewrites in BigQuery

[OPTIONS(

[description="materialized_view_comment",] \ [other materialized_view_option_list]

)]

[PARTITION BY (col_name)] --same as source table

CREATE FUNCTION および DROP FUNCTION ステートメント

次の表に、Hive から BigQuery へのストアド プロシージャの変換に関する詳細を示しています。

Hive BigQuery
CREATE TEMPORARY FUNCTION function_name AS class_name; CREATE { TEMPORARY | TEMP } FUNCTION function_name ([named_parameter[, ...]])

[RETURNS data_type]

AS (sql_expression)

named_parameter:

param_name param_type

DROP TEMPORARY FUNCTION [IF EXISTS] function_name; サポート対象外
CREATE FUNCTION [db_name.]function_name AS class_name

[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

アルファ版の機能として、許可リストに登録されたプロジェクトでサポートされています。

CREATE { FUNCTION | FUNCTION IF NOT EXISTS | OR REPLACE FUNCTION }

function_name ([named_parameter[, ...]])

[RETURNS data_type]

AS (expression);

named_parameter:

param_name param_type

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 では、スナップショット分離を使用して、オプティミスティック同時実行制御(先の commit が優先)を行います。この場合、クエリは、クエリ開始前に最後に commit されたデータを読み取ります。この方法により、各行とミューテーションおよび同じ DML ステートメント内の行全体にわたって同じレベルの整合性が保証され、デッドロックも回避されます。同じテーブルに対する複数の DML 更新では、BigQuery は悲観的同時実行制御に切り替わります。読み込みジョブは個別に実行でき、テーブルを追加できますが、BigQuery は、明示的なトランザクション境界もセッションも提供しません。

トランザクション

Hive は、複数ステートメントのトランザクションをサポートしていません。また、BEGINCOMMITROLLBACK ステートメントもサポートしていません。Hive では、すべての言語オペレーションが自動的に commit されます。

BigQuery は、セッションを使用する場合、1 つのクエリ内または複数のクエリにわたってマルチステートメント トランザクションをサポートします。マルチステートメント トランザクションを使用すると、1 つ以上のテーブルから行の挿入や削除、変更の commit、ロールバックなどの変更操作を実行できます。詳細については、マルチステートメント トランザクションをご覧ください。