presto簡單介紹
presto是一個分佈式的sql交互式查詢引擎。能夠達到hive查詢效率的5到10倍。支持多種數據源的秒級查詢。html
presto是基於內存查詢的,這也是它爲何查詢快的緣由。除了基於內存,presto還使用了java
-
- 向量計算,
- 動態編譯執⾏計劃
- 優化的ORC和Parquet Reader技術
從而優化查詢的速度。mysql
-
- presto和hive的對比
hive和presto是針對不一樣使用場景的。presto雖然查詢很快,可是也不是適用於全部的查詢場景。
好比作多張大表的關聯查詢,
因爲presto是基於內存查詢的。作大表關聯查詢時,數據要加載到內存中,假如使用presto查詢超過了幾分鐘纔會有返回。
且嚴重影響集羣的性能。這就違背了presto交互式查詢的初衷,交互式就是要作到近實時查詢與返回。
因此,presto不適合作多張大表的join操做或者ETL操做。這種狀況就該使用hive了。
另外,hive只能作hdfs查詢(es等須要插件支持),而presto支持了mysql,pg,kafka,redis等。
總之,presto是支持多數據源的查詢利器。 - 適用場景
presto不該做爲etl工具,和作多表關連查詢。而應該更多的做爲單表的查詢操做。 結合咱們的業務場景,不難想到,presto適用的場景是
- 在數倉的前兩層,presto能夠作驗數,查詢某條數據使用;
- 業務人員和數據分析師在操做生成好的事實表查詢時,使用presto,體驗會有很大的提高
- presto和hive的對比
presto的使用
presto的官方文檔寫的十分清楚,相信你們結合文檔,能夠很快的把一句hive sql 轉化爲presto sql
https://prestodb.github.io/docs/current/git
-
- json解析
-
由於咱們解析log最經常使用的就是json解析。
咱們單獨說下json解析的方法。直接上代碼:github-- employee表的xjson字段,只有一條數據 [{"name":"王二","sex":"男","age":"25"},{"name":"李四","sex":"男","age":"47"}]
取出"王二"的年齡:redis
-
hive sql爲:sql
select get_json_object(xjson,'$.[0].age') from employee limit 1;
hive 查詢結果爲: 25json
-
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,請參考個人另外一篇文章
http://www.javashuo.com/article/p-fmulaque-bg.html