presto 掃盲 行列轉置函式

2021-08-19 21:45:56 字數 1648 閱讀 8634

一,

presto是什麼:

是facebook的開源的,完全基於記憶體的並⾏計算,分布式sql互動式查詢引擎

是一種大規模並行處理(mpp)架構,多節點管道式執行

⽀持任意資料來源(通過擴充套件式聯結器元件),資料規模gb〜pb級

使用的技術,如向量計算,動態編譯執行計畫,優化的orc和parquet reader等

presto不太支援儲存過程,支援部分標準sql

presto的查詢速度比hive快5-10倍

適合:pb級海量資料複雜分析,互動式sql查詢,⽀持跨資料來源查詢

不適合:多個大表的連線操作,因為急是基於記憶體的,多張大表在記憶體裡可能放不下

二,presto

和hive的對比

hive是乙個資料倉儲,是乙個互動式比較弱一點的查詢引擎,互動式沒有似的那麼強,而且只能訪問hdfs的資料

presto是乙個互動式查詢引擎,可以在很短的時間內返回查詢結果,秒級,分鐘級,能訪問很多資料來源

presto是乙個分布式sql查詢引擎,它被設計為用來專門進行高速,實時的資料分析。

hive在查詢的100gb的級別的資料時,消耗時間已經是分鐘級了

但是presto

是取代不了hive

的,因為p全部的資料都是在記憶體中,限制了在記憶體中的資料集大小,比如多個大表的連線,這些大表是不能完全放進記憶體的,實際應用中,對於在presto的查詢是有一定規定條件的,比比如說乙個查詢在急查詢超過30分鐘,那就殺掉吧,說明不適合在presto上使用,主要原因是,查詢過大的話,會占用整個集群的資源,這會導致你後續的查詢是沒有資源進行查詢的,這跟presto的設計理念是衝突的,就像是你進行乙個查詢,但是要等個5分鐘才有資源繼續查詢,這是很不合理的,互動式就變得弱了很多

presto的實現和hive有著本質的不同:

hive是把乙個查詢轉化成多個stage的mapreduce的任務,然後乙個接乙個執行。執行的中間結果通過對磁碟的讀寫來同步。

然而,presto沒有使用mapreduce,它是通過乙個定製的查詢和執行引擎來完成的。它的所有的查詢處理是在記憶體中,這也是它的效能很高的乙個主要原因。所以在日常使用中,如果有大量的連線偶爾會發生記憶體不足的報錯,乙個常見的解決方法是生成中間表的方式來減少加入的次數。

三,presto中的行列轉置函式

select

mate,

pv,uv

from(

select

element_at(attr,'分類') fenlei,

sum(pv) as pv,

count(distinct uv_id) as uv

from shots.ad a

left join hive.onetrue.f_t_traffic b

on a.ad_id =b.ad_id

where transaction_date between date('2017-01-01') and date('2018-04-30')

group by

element_at(attr,'分類') ) traffic

cross join unnest(split(traffic.fenlei,',')) as t ( mate )

資料行列轉置函式

對於sqlserver資料庫列轉行用pivot函式,行轉列用unpivot函式。示例如下 use test create table tb2 name varchar 10 project varchar 10 score int insert into tb2 values 張三 跳遠 300 i...

Oracle 行列轉置

兩種簡單的行列轉置 1 固定列數的行列轉換 如student subject grade student1 語文 80 student1 數學 70 student1 英語 60 student2 語文 90 student2 數學 80 student2 英語 100 轉換為 語文 數學 英語 s...

SQL 行列轉置

我學會了第二種方法 sql2005中的方法 create table tb id int,value varchar 10 insert into tb values 1,aa insert into tb values 1,bb insert into tb values 2,aaa insert...