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