• presto调研和json解析函数的使用


    presto简单介绍

              presto是一个分布式的sql交互式查询引擎。可以达到hive查询效率的5到10倍。支持多种数据源的秒级查询。

              presto是基于内存查询的,这也是它为什么查询快的原因。除了基于内存,presto还使用了

      • 向量计算,
      • 动态编译执⾏计划
      • 优化的ORC和Parquet Reader技术

              从而优化查询的速度。

      1. presto和hive的对比
        hive和presto是针对不同使用场景的。presto虽然查询很快,但是也不是适用于所有的查询场景。
        比如做多张大表的关联查询,
        由于presto是基于内存查询的。做大表关联查询时,数据要加载到内存中,假如使用presto查询超过了几分钟才会有返回。
        且严重影响集群的性能。这就违背了presto交互式查询的初衷,交互式就是要做到近实时查询与返回。
        所以,presto不适合做多张大表的join操作或者ETL操作。这种情况就该使用hive了。
        另外,hive只能做hdfs查询(es等需要插件支持),而presto支持了mysql,pg,kafka,redis等。
        总之,presto是支持多数据源的查询利器。

      2. 适用场景
        presto不应作为etl工具,和做多表关连查询。而应该更多的作为单表的查询操作。
      3. 结合我们的业务场景,不难想到,presto适用的场景是
        1. 在数仓的前两层,presto可以做验数,查询某条数据使用;
        2. 业务人员和数据分析师在操作生成好的事实表查询时,使用presto,体验会有很大的提升 

    presto的使用

               presto的官方文档写的十分清楚,相信大家结合文档,可以很快的把一句hive sql 转化为presto sql

               https://prestodb.github.io/docs/current/

      • json解析
      • 因为我们解析log最常用的就是json解析。
        我们单独说下json解析的方法。直接上代码:

        --  employee表的xjson字段,只有一条数据
        [{"name":"王二","sex":"男","age":"25"},{"name":"李四","sex":"男","age":"47"}]

        取出"王二"的年龄:

      • hive sql为:

        select
        	get_json_object(xjson,'$.[0].age')
        	from 
        	employee limit 1;

        hive 查询结果为: 25

      • presto 对json的处理函数是 json_array_get() 和 json_extract()

        -- 我们分步操作,先用 json_array_get()取出jsonArray的第一个元素
        select
        	json_array_get(xjson,0)
        	from 
        		employee
        	limit 1;

        presto查询结果:  {"name":"王二","sex":"男","age":"25"}

        -- 再介绍下用 json_extract() 在 {"name":"王二","sex":"男","age":"25"} 中查询 "王二"的年龄
        -- json_extract 和 hive中的get_json_object类似
        select
        	json_extract('{"name":"王二","sex":"男","age":"25"}', '$.age')

        presto查询结果是:25

         

              总结:presto提供了解析json的函数, json_array_get() 和 json_extract(),对于jsonArray,需要用 json_array_get() 获取到从0开始的第几个元素。
                         对与jsonObject和hive的get_json_object()的用法一致。
     
          hive函数 get_json_object,请参考我的另一篇文章 https://www.cnblogs.com/drjava/p/10486134.html
     
  • 相关阅读:
    git系列3之简单命令(查看不同|文件提交|文件移除|重命名)
    git系列2之简单命令(乱码问题|修改文件提交|忽略文件)
    git系列1之安装初体验(windows)
    mongodb主从复制副本集(12)
    mongodb系统知识(11)
    mongodb系统知识(10)
    linux下h2集群创建,及java集成详细步骤
    windows下创建h2集群,及java集成详细步骤
    MySQL与Oracle 差异比较之一数据类型
    快速恢复update了的orcale数据表
  • 原文地址:https://www.cnblogs.com/drjava/p/10536922.html
Copyright © 2020-2023  润新知