presto基础
Presto查询引擎是一个Master-Slave的架构,由一个Coordinator节点,一个Discovery Server节点,多个Worker节点组成,Discovery Server通常内嵌于Coordinator节点中。Coordinator负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行。Worker节点负责实际执行查询任务。Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息,Worker节点与HDFS交互读取数据。
特点:
1、presto对于数组的取值是从1开始的,hive是从0开始的
2、presto不支持hive视图
3、完全基于内存的并行计算、动态编译执行计划、GC控制
参考
参考-部署
常用函数
1.窗口函数及其搭配
例:sum(a)over(partition by x)
根据x分组后对a求和
rank()over(partition by x order by y desc)
根据x分组后按y的值降序排列并生成排名
- rank()会考虑重复情况(返回值就是小于等于该行值的行数),如果字段值相同,则返回序号相同,下一条记录需要则需顺延一位,即跳跃排序,如果不想重复可以使用dence_rank(), 用法相同,结果为连续排序
- row_number():为查询出来的每一行记录生成一个序号,依次排序
- cume_dist() :计算某个值在该组中的累积分布(即值在改组中的相对位置),返回小于等于(该行值的行数 -1)/ (总行数-1),结果的取值范围为(0,1]
- precent_rank(): 计算该行值在该组中的百分比位置(返回小于等于该行值的行数 / 总行数 )
2.数据转换cast()
cast(x as bigint)
bigint整数/varchar字符/decimal(10,2)小数
3.日期函数
date_format(date_add(‘day’,-1,CURRENT_DATE), ‘%y%m%d’)
获得昨天的日期,-1位置可以更改,day可换成month、year
4.连接字符串
横向连接:concat(a,b,c,…),这里abc可以是变量也可以是自定义的连接符,如’-’、’,’、’;’;
纵向连接:array_join(array_agg(a),’,’) ,可以搭配group by实现组内连接
提高性能——调试
1.指定需要返回的字段
2.合理使用GROUP BY
- 当过滤条件作用在分区字段上面时,可以减少数据扫描的范围,有效提升查询性能;
- 当group by的数值型字段将比字符型更节省内存空间;
- 还应考虑统计字段基数(某字段拥有不同值的个数),将基数大的字段放在前面
3.order by 和 limit 配合使用
- order by 将所有数据放到一个worker中进行排序,这将消耗大量的内存空间,搭配limit,可以有效减小使用的内存空间,提升查询性能;
- 另外,可以只使用size=N的优先级队列所占用内存空间非常小,所以在使用topN就能满足需求时优先使用topN
4.join的时候把大表放在左边
- presto在join的时候采用的是broadcast join,意思是右边的表将全部数据send到各个worker和左边的表(每个worker持有一部分左边表的数据)进行关联查
- 有的时候如果右边的表确实很大,那么有可能遇到“ERROR:Exceeded max memory xxGB”,这个xxGB是配置文件中指定的每次查询worker使用的最大内存空间。超过这个阈值将报这个异常信息。这种情况要不就调整参数,要不就使用“distributed hash join”。
- 另,可在 etc/config.properties增加配置如下:distributed-joins-enabled=true
presto查询SQL报错汇总
1.remote page is too large
错误原因:body.length+content.length长度不能超过102400