Hiveからの移行¶
PrestoはANSI SQL構文とセマンティクスを使用しますが、HiveはMySQL(それ自体がANSI SQLと多くの違いがある)を緩くモデルとしたHiveQLと呼ばれる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構文を使用する¶
配列のインデックスは0ではなく1から始まります
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 ...
特に、STRING
の代わりにVARCHAR
を使用します。
整数を分割するときはCASTを使用する¶
Prestoは、2つの整数を分割するときに整数除算を実行するという標準の動作に従います。たとえば、7
を2
で割ると、3.5
ではなく3
になります。2つの整数に対して浮動小数点除算を実行するには、それらのいずれかを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をサポートしています。LATERAL VIEW explode()
の代わりにUNNEST
を使用します。
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);