1. 程式人生 > >Presto-SQL與Hive-SQL區別與聯絡

Presto-SQL與Hive-SQL區別與聯絡

一、前言

 

 

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