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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM