從 Hive 遷移

Presto 使用 ANSI SQL 語法和語義,而 Hive 使用一種稱為 HiveQL 的類 SQL 語言,其鬆散地以 MySQL 為模型(而 MySQL 本身與 ANSI SQL 有許多差異)。

使用下標存取陣列的動態索引,而不是使用 UDF

SQL 中的下標運算子支援完整的表達式,這與 Hive 不同(Hive 僅支援常數)。 因此,您可以撰寫如下的查詢:

SELECT my_array[CARDINALITY(my_array)] as last_element
FROM ...

避免超出陣列邊界存取

存取陣列的超出邊界元素將會導致例外。您可以使用 if 來避免這種情況,如下所示:

SELECT IF(CARDINALITY(my_array) >= 3, my_array[3], NULL)
FROM ...

使用 ANSI SQL 語法處理陣列

陣列的索引從 1 開始,而不是從 0 開始

SELECT my_array[1] AS first_element
FROM ...

使用 ANSI 語法建構陣列

SELECT ARRAY[1, 2, 3] AS my_array

使用 ANSI SQL 語法處理識別符號和字串

字串使用單引號分隔,而識別符號使用雙引號引用,而不是反引號

SELECT name AS "User Name"
FROM "7day_active"
WHERE name = 'foo'

引用以數字開頭的識別符號

在 ANSI SQL 中,以數字開頭的識別符號是不合法的,必須使用雙引號引用

SELECT *
FROM "7day_active"

使用標準字串串連運算子

使用 ANSI SQL 字串串連運算子

SELECT a || b || c
FROM ...

使用標準類型作為 CAST 目標

以下標準類型支援作為 CAST 目標:

SELECT
  CAST(x AS varchar)
, CAST(x AS bigint)
, CAST(x AS double)
, CAST(x AS boolean)
FROM ...

特別注意,使用 VARCHAR 而不是 STRING

在整數相除時使用 CAST

當兩個整數相除時,Presto 遵循執行整數除法的標準行為。 例如,將 7 除以 2 將會得到 3,而不是 3.5。 若要對兩個整數執行浮點數除法,請將其中一個轉換為 double

SELECT CAST(5 AS DOUBLE) / 2

對於複雜的表達式或查詢,使用 WITH

當您想要將複雜的輸出表達式重新用作篩選器時,請使用內嵌子查詢,或使用 WITH 子句將其分解出來

WITH a AS (
  SELECT substr(name, 1, 3) x
  FROM ...
)
SELECT *
FROM a
WHERE x = 'foo'

使用 UNNEST 來展開陣列和映射

Presto 支援 UNNEST 來展開陣列和映射。 請使用 UNNEST 而不是 LATERAL VIEW explode()

Hive 查詢

SELECT student, score
FROM tests
LATERAL VIEW explode(scores) t AS score;

Presto 查詢

SELECT student, score
FROM tests
CROSS JOIN UNNEST(scores) AS t (score);