presto函数和hive函数的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdyjy_litao/article/details/80693635

最近做大数据分析工作比较多,主要与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...


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



展开阅读全文

没有更多推荐了,返回首页