版权声明:学习交流为主,未经博主同意禁止转载,禁止用于商用。 https://blog.csdn.net/u012965373/article/details/83352896
一、前言
Presto使用ANSI SQL语法和语义,而Hive使用类似SQL的语言,称为HiveQL,它在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);