從 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);