乐知付加密服务平台

如果你有资源, 平台可以帮你实现内容变现, 无需搭建知识付费服务平台。

点击访问官方网站 https://lezhifu.cc

扫码关注公众号 乐知付加密服务平台-微信公众号
Presto-SQL与Hive-SQL的区别与联系 | chenzuoli's blog

Presto-SQL与Hive-SQL的区别与联系

      Presto作为一个数据仓库后端的OLAP分析查询系统,提供了比Hive更快的查询速度,能及时提供用户的分析结果数据,深受OLAP用户喜爱,那么我们从hive迁移到presto时他们的查询方式有哪些区别与联系呢,下面来看看。

一、前言

      Presto使用ANSI SQL语法和语义,而Hive使用类似SQL的语言,称为HiveQL,它在MySQL(它本身与ANSI SQL有很多不同)之后进行了松散的建模。

二、使用下标来访问数组的动态索引而不是udf

      SQL中的下标运算符支持完整表达式,与Hive(仅支持常量)不同。因此,您可以编写如下查询:

1
2
SELECT my_array[CARDINALITY(my_array)] as last_element
FROM ...

三、避免超出阵列的边界访问

      访问数组的超出边界元素将导致异常。您可以通过以下方式避免这种if情况:

1
2
SELECT IF(CARDINALITY(my_array) >= 3, my_array[3], NULL)
FROM ...

四、对数组使用ANSI SQL语法

      数组从1开始索引,而不是从0开始:

1
2
SELECT my_array[1] AS first_element
FROM ...

      使用ANSI语法构造数组:

1
SELECT ARRAY[1, 2, 3] AS my_array

五、对标识符和字符串使用ANSI SQL语法

      字符串用单引号分隔,标识符引用双引号,而不是反引号:

1
2
3
SELECT name AS "User Name"
FROM "7day_active"
WHERE name = 'foo'

六、引用以数字开头的标识符

      以数字开头的标识符在ANSI SQL中不合法,必须使用双引号引用:

1
2
SELECT *
FROM "7day_active"

七、使用标准字符串连接运算符

      使用ANSI SQL字符串连接运算符:

1
2
SELECT a || b || c
FROM ...

八、使用CAST目标的标准类型

      CAST目标支持以下标准类型:

1
2
3
4
5
6
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:

1
SELECT CAST(5 AS DOUBLE) / 2

十、使用WITH表示复杂的表达式或查询

      如果要将复杂输出表达式重用为过滤器,请使用内联子查询或使用WITH子句将其分解:

1
2
3
4
5
6
7
WITH a AS (
  SELECT substr(name, 1, 3) x
  FROM ...
)
SELECT *
FROM a
WHERE x = 'foo'

十一、使用UNNEST扩展数组和映射

      Presto支持UNNEST扩展阵列和地图。用UNNEST而不是。LATERAL VIEW explode()
      Hive查询:

1
2
3
SELECT student, score
FROM tests
LATERAL VIEW explode(scores) t AS score;

      Presto查询:

1
2
3
SELECT student, score
FROM tests
CROSS JOIN UNNEST(scores) AS t (score);

If I were you, I would do what I want.

书山有路勤为径,学海无涯苦作舟。

欢迎关注微信公众号:【程序员写书】
程序员写书

喜欢宠物的朋友可以关注:【电巴克宠物Pets】
电巴克宠物

一起学习,一起进步。

-------------本文结束感谢您的阅读-------------