為什麼我們選擇parquet

2021-08-28 12:05:52 字數 1851 閱讀 4560

前用的hadoop,一直有個疑惑。當時沒有細究,昨天突然想到,就又順著看了下,經過調整,原來在presto中要用1分鐘的,現在基本可以秒級別出結果,和presto無關,和檔案儲存格式有關,hdfs預設存的是文字格式,所以hive,presto,都是在文字格式上做計算,hadoop本身是全表掃,只是分布式而以,所以我們之前用的就是分布式的全表掃而以,沒有發揮出資料倉儲該有的功能,列式儲存,天然擅長分析,千萬級別的表,count,sum,group by ,秒出結果!!

說明:此方案已經我們已經執行1年。

1、場景描述:

我們對客戶登入日誌做了資料倉儲,但實際業務使用中有一些個共同點,

a  需要關聯維度表

b  最終僅取某個產品一段時間內的資料

c 只關注其中極少的字段

基於以上業務,我們決定每天定時統一關聯維度表,對關聯後的資料進行另外儲存。各個業務直接使用關聯後的資料進行離線計算。

2、擇parquet的外部因素

在各種列儲存中,我們最終選擇parquet的原因有許多。除了parquet自身的優點,還有以下因素

a、公司當時已經上線spark 集群,而spark天然支援parquet,並為其推薦的儲存格式(預設儲存為parquet)。

b、hive 支援parquet格式儲存,如果以後使用hiveql 進行查詢,也完全相容。

3、選擇parquet的內在原因

下面通過對比parquet和csv,說說parquet自身都有哪些優勢

csv在hdfs上儲存的大小與實際檔案大小一樣。若考慮副本,則為實際檔案大小*副本數目。(若沒有壓縮)

3.1 parquet採用不同壓縮方式的壓縮比

說明:原始日誌大小為214g左右,120+欄位

採用csv(非壓縮模式)幾乎沒有壓縮。

若我們在hdfs上儲存3份,壓縮比仍達到4、9、6倍

3.2 分割槽過濾與列修剪

3.2.1分割槽過濾

parquet結合spark,可以完美的實現支援分割槽過濾。如,需要某個產品某段時間的資料,則hdfs只取這個資料夾。

spark sql、rdd 等的filter、where關鍵字均能達到分割槽過濾的效果。

使用spark的partitionby 可以實現分割槽,若傳入多個引數,則建立多級分割槽。第乙個字段作為一級分割槽,第二個字段作為2級分割槽。。。。。

3.2.2 列修剪

列修剪:其實說簡單點就是我們要取回的那些列的資料。

當取得列越少,速度越快。當取所有列的資料時,比如我們的120列資料,這時效率將極低。同時,也就失去了使用parquet的意義。

3.2.3 分割槽過濾與列修剪測試如下:

說明:a、task數、input值、耗時均為spark web ui上的真實資料。

b、之所以沒有驗證csv進行對比,是因為當200多g,每條記錄為120欄位時,csv讀取乙個欄位算個count就直接lost excuter了。

c、注意:為避免自動優化,我們直接列印了每條記錄每個欄位的值。(以上耗時估計有多部分是耗在這裡了)

d、通過上圖對比可以發現:

e、測試時請開啟filterpushdown功能

4、結論

我們為什麼選擇深圳

留在深圳的理由 在深圳,你會有一種探不到底的自由。探不到底,意味著無論你是貧是富是博士還是文盲,在深圳你都無法找到自己準確的位置。假如你擁有千萬資產,那麼在內地某個城市,你一定進入了富豪行列,你可以在那個城市享受最奢華的待遇,你花出去的每一筆金錢都有可能為你帶來周 遭尊敬而熱烈的注目禮 然而在深圳,...

我們為什麼選擇Linux

第 一 不要拿他和windows做對比 第二 不要拿他和windows做對比 第三 不要拿他和windows做對比 這是乙個你可以直接讀原始碼的作業系統,基於unix的作業系統。他能夠完成各種作業系統該幹的事情,比如記憶體管理,檔案管理 硬體管理,電源管理,網路管理等,而且完全可以在你眼皮子地下進行...

我們為什麼選擇CentOS

伺服器作業系統大多採用unix和linux作業系統,而linux發行版本系統中,多使用centos redhat ubuntu gentoo debian。而這些發行版本可以大體分為兩類,一類是商業公司維護的發行版本,一類是社群組織維護的發行版本,前者以著名的redhat rhel 為代表,後者以d...