Presto 0.100 Documentation

8.1. 从Hive迁移

8.1. 从Hive迁移

Presto使用ANSI SQL的语法和语义,而Hive使用的是一种名为HiveQL的类似SQL的语言,它模仿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 ...

使用标准的类型去转换目标::

以下标准类型支持 转换 目标:

SELECT
  CAST(x AS varchar)
, CAST(x AS bigint)
, CAST(x AS double)
, CAST(x AS boolean)
FROM ...

特别注意,使用 VARCHAR 而不是 STRING

在整数除法中使用转换

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展开数组和map

Presto支持使用 UNNEST 展开数组和map。 使用 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);

Outer Join的差异

按照ANSI SQL规则,Presto认为 整个 ON 语句的作用就是判定左边的表中的一行是否要和右边的表中的行进行关联操作。在 LEFT JOIN 中,左边表中的所有行都会显示在最终的查询结果中;在 RIGHT JOIN 操作中是相反的。相反,Hive 首先ON 子句中使用常量过滤, 然后 执行join。当使用 ON 子句关联外部表时,这会使结果会产生非常大的差别。

当你要将Hive的 OUTER_JOIN 查询转为Presto查询时,注意Hive认为 ON 子句是 WHERE 子句的一部分。因此为了在Presto中得到同样的效果,你需要将 ON 子句放到 WHERE 子句中。

Hive查询:

SELECT a.id, b.userid
FROM a
LEFT JOIN b
ON a.id = b.id AND a.ds = '2013-11-11'

Presto查询:

SELECT a.id, b.userid
FROM a
LEFT JOIN b
ON a.id = b.id
WHERE a.ds = '2013-11-11'