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つの整数を分割するときに整数除算を実行するという標準の動作に従います。たとえば、72で割ると、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);