最近做大数据分析工作比较多,主要与presto和hive查询引擎打交道,presto在实时计算上真的很快(个人感觉比hive要快10倍吧),但是hive在面向海量数据的分析计算上也是很牛逼的,这里不得不记录下两者在使用上的一些区别。
粘贴一段二者计算原理区别的解释,^_^
Presto 的运行模型和 Hive 或 MapReduce 有着本质的区别。Hive 将查询翻译成多阶段的 MapReduce 任务,一个接着一个地运行。每一个任务从磁盘上读取输入数据并且将中间结果输出到磁盘上。然而Presto引擎没有使用MapReduce。为支持 SQL 语法,它实现了一个定制的查询、执行引擎和操作符。除了改进的调度算法之外,所有的数据处理都是在内存中进行的。不同的处理端通过网络组成处理的流水线。这样会避免不必要的磁盘读写和额外的延迟。这种流水线式的执行模型会在同一时间运行多个数据处理段,一旦数据可用的时候就会将数据从一个处理段传入到下一个处理段。这样的方式会大大的减少各种查询的端到端延迟。
Presto的实现和Hive有着本质的不同:
Hive是把一个查询转化成多个stage的MapReduce的任务,然后一个接一个执行。执行的中间结果通过对磁盘的读写来同步。然而,Presto没有使用MapReduce,它是通过一个定制的查询和执行引擎来完成的。它的所有的查询处理是在内存中,这也是它的性能很高的一个主要原因。
关于presto,了解更多:https://tech.meituan.com/presto.html
1、窗口函数和排序函数
二者一般组合使用,比如:
rank() over(partition BY dt, customer ORDER BY created DESC) idx
其中over是开窗函数,partition by指定分组维度,order by指定每个维度内的排序规则;
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...
(想到一点写一点,持续更新。。。。。。)
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。