presto基础

Proesto 官网文档

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交互读取数据。
presto sql常用函数、性能优化 、常见问题汇总

特点:
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

相关文章: