presto函数和hive函数的使用

最近作大数据分析工做比较多,主要与presto和hive查询引擎打交道,presto在实时计算上真的很快(我的感受比hive要快10倍吧),可是hive在面向海量数据的分析计算上也是很牛逼的,这里不得不记录下二者在使用上的一些区别。html

粘贴一段两者计算原理区别的解释,^_^算法

Presto 的运行模型和 Hive 或 MapReduce 有着本质的区别。Hive 将查询翻译成多阶段的 MapReduce 任务,一个接着一个地运行。每个任务从磁盘上读取输入数据而且将中间结果输出到磁盘上。然而Presto引擎没有使用MapReduce。为支持 SQL 语法,它实现了一个定制的查询、执行引擎和操做符。除了改进的调度算法以外,全部的数据处理都是在内存中进行的。不一样的处理端经过网络组成处理的流水线。这样会避免没必要要的磁盘读写和额外的延迟。这种流水线式的执行模型会在同一时间运行多个数据处理段,一旦数据可用的时候就会将数据从一个处理段传入到下一个处理段。这样的方式会大大的减小各类查询的端到端延迟。
sql

Presto的实现和Hive有着本质的不一样:网络

Hive是把一个查询转化成多个stage的MapReduce的任务,而后一个接一个执行。执行的中间结果经过对磁盘的读写来同步然而,Presto没有使用MapReduce,它是经过一个定制的查询和执行引擎来完成的。它的全部的查询处理是在内存中,这也是它的性能很高的一个主要缘由。app

关于presto,了解更多:https://tech.meituan.com/presto.html函数

一、窗口函数和排序函数性能

两者通常组合使用,好比:大数据

rank() over(partition BY dt, customer ORDER BY created DESC) idx

其中over是开窗函数,partition by指定分组维度,order by指定每一个维度内的排序规则;spa

rank()是排序函数,以上函数会将数据以dt,customer进行分组,在每一个分组内按照created进行降序排列,而且从1开始生成序号idx,举例:翻译

SELECT
	customer,
	waiter,
	created,
	response_time,
	rank() over(partition BY dt, customer ORDER BY created) idx
FROM
	app.XXXXXXXX
WHERE
	dt = sysdate( - 1)
	AND XXX = 'jd.waiter'
	AND XXX= 1
	AND XXXis null
	AND XXX is null
ORDER BY
	dt,
	customer,
	idx

输出:


排序函数经常使用的有:

row_number() 会为查询出来的每一行记录生成一个序号,依次排序且不会重复 从1开始

排序举例:1,2,3,4,1,2,3,1,2,3,4,5,1,2...

rank() 与row_number 用法一致,可是考虑重复状况,若是字段值相同,则返回序号相同,下一条记录须要则需顺延一位,即跳跃排序,有两个第一名时接下来就是第三名

排序举例:1,1,3,3,5,6,6,6,9...

dence_rank() 与rank用法一致,rank() 为跳跃排序,dence_rank() 为连续排序,即有两个第一名时接下来就是第二名

排序举例:1,1,2,2,2,3,3,3,4,4,4,5,6,6,6...


(想到一点写一点,持续更新。。。。。。)