Apache Hive SQL 翻譯指南
本文詳述 Apache Hive 和 BigQuery 之間的 SQL 語法相似與相異之處,協助您規劃遷移作業。如要大量遷移 SQL 指令碼,請使用 批次 SQL 翻譯。如要翻譯臨時查詢,請使用互動式 SQL 翻譯。
在某些情況下,Hive 和 BigQuery 中的 SQL 元素之間沒有直接對應關係。不過,在大多數情況下,BigQuery 會提供 Hive 的替代元素,協助您達到相同的功能,如本文件中的範例所示。
本文件的目標對象為企業架構師、資料庫管理員、應用程式開發人員和 IT 安全專家。假設您已熟悉 Hive。
資料類型
Hive 和 BigQuery 採用不同的資料類型系統。在大多數情況下,您可以將 Hive 中的資料類型對應至 BigQuery 資料類型,但仍有少數例外狀況,例如 MAP 和 UNION。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 | 
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] JOINLEFT [OUTER] JOINRIGHT [OUTER] JOINFULL [OUTER] JOINCROSS JOIN和等同的隱含逗號交叉聯結
類型轉換和轉換
下表詳細說明如何將函式從 Hive 轉換為 BigQuery:
| 函式或運算子 | Hive | BigQuery | 
|---|---|---|
| 類型轉換 | 轉換失敗時,系統會傳回 `NULL`。 | 與 Hive 相同的語法。如要進一步瞭解 BigQuery 類型轉換規則,請參閱「轉換規則」。 如果投放失敗,系統會顯示錯誤訊息。如要獲得與 Hive 相同的行為,請改用   | 
    
SAFE 函式呼叫 | 
      如果您在函式呼叫前加上 SAFE,函式會傳回 NULL,而不是回報失敗。舉例來說,SAFE.SUBSTR('foo', 0, -2) AS safe_output; 會傳回 NULL。注意:如要安全地投放且不發生錯誤,請使用   | 
    
隱含轉換類型
遷移至 BigQuery 時,您需要將大部分的 Hive 隱含轉換轉換為 BigQuery 明確轉換,但下列資料類型除外,因為 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) 函式。
函式
本節將說明 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
    | 
   
    建議使用 CURRENT_DATETIME,因為這個值不含時區,且與 Hive 中的 CURRENT_TIMESTAMP \ CURRENT_TIMESTAMP 同義。 | 
  
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) 語法差異。
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 作業最多只能與每個目標資料列相符的來源資料列。
| Hive | BigQuery | 
|---|---|
MERGE INTO 
ON 
 
 
  | 
   MERGE target
USING source
 
 
 
 
 
 注意:你必須列出所有需要更新的資料欄。  | 
  
ALTER 陳述式
下表詳細說明如何將 CREATE VIEW 陳述式從 Hive 轉換為 BigQuery:
| 功能 | 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_nameADD [CONSTRAINT [IF NOT EXISTS] [constraint_name]] constraint NOT ENFORCED;ALTER TABLE [[project_name.]dataset_name.]table_nameADD 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 陳述式
下表詳細說明如何將 CREATE TABLE 陳述式從 Hive 轉換為 BigQuery:
| 類型 | 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 陳述式
下表詳細說明如何將 CREATE VIEW 陳述式從 Hive 轉換為 BigQuery:
| 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
  | 
   支援已加入許可清單的專案,做為 Alpha 版功能。 
 
   
   
   
 
    | 
  
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 支援單一查詢內的多個陳述式交易,或跨多個查詢的交易。多陳述式交易可讓您執行變異作業,例如在一個或多個資料表中插入或刪除資料列,並提交或回復變更。詳情請參閱「多語句交易」。