从 Hive 迁移

Presto 使用 ANSI SQL 语法和语义,而 Hive 使用一种类似 SQL 的语言,称为 HiveQL,它松散地基于 MySQL(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);