Presto-SQL與Hive-SQL區別與聯絡
阿新 • • 發佈:2018-11-07
一、前言
Presto使用ANSI SQL語法和語義,而Hive使用類似SQL的語言,稱為HiveQL,它在MySQL(它本身與ANSI SQL有很多不同)之後進行了鬆散的建模。
二、使用下標來訪問陣列的動態索引而不是udf
SQL中的下標運算子支援完整表示式,與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);