當前位置:首頁 » 服務存儲 » 列式存儲怎麼查詢數據
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

列式存儲怎麼查詢數據

發布時間: 2023-01-17 15:09:52

① 列式資料庫有哪些

列式資料庫是以列相關存儲架構進行數據存儲的資料庫,主要適合與批量數據處理和即席查詢。相對應的是行式資料庫,數據以行相關的存儲體系架構進行空間分配,主要適合與小批量的數據處理,常用於聯機事務型數據處理。

不讀取無效數據:降低 I/O 開銷,同時提高每次 I/O 的效率,從而大大提高查詢性能。查詢語句只從磁碟上讀取所需要的列,其他列的數據是不需要讀取的。例如,有兩張表,每張表100GB 且有100 列,大多數查詢只關注幾個列,採用列存儲,不需要像行存資料庫一樣,將整行數據取出,只取出需要的列。磁碟 I/0 是行存儲的 1/10或更少,查詢響應時間提高 10 倍以上。

高壓縮比:壓縮比可以達到 5 ~ 20 倍以上,數據佔有空間降低到傳統資料庫的1/10 ,節省了存儲設備的開銷。

當資料庫的大小與資料庫伺服器內存大小之比達到或超過 2:1 (典型的大型系統配置值)時,列存的 I/O 優勢就顯得更加明顯;

GBase 8a 分析型資料庫的獨特列存儲格式,對每列數據再細分為「數據包」。這樣可以達到很高的可擴展性:無論一個表有多大,資料庫只操作相關的數據包,性能不會隨著數據量的增加而下降。通過以數據包為單位進行 I/O 操作提升數據吞吐量,從而進一步提高I/O效率。

由於採用列存儲技術,還可以實現高效的透明壓縮。

由於數據按列包存儲,每個數據包內都是同構數據,內容相關性很高,這使得GBase 8a 更易於實現壓縮,壓縮比通常能夠達到 1:10 甚至更優。這使得能夠同時在磁碟 I/O 和 Cache I/O 上都提升資料庫的性能,使 GBase 8a 在某些場景下的運算性能比傳統資料庫快 100 倍以上。

GBase 8a 允許用戶根據需要設置配置文件,選擇是否進行壓縮。在啟用壓縮的情況下GBase 8a 根據數據的不同特性以及不同的分布狀況,自動採用相應的壓縮演算法,如:

行程編碼(適用於大量連續重復的數據,特別是排序數據);

基於數據的差值編碼(適用於重復率低,但彼此差值較小的數據列);

基於位置的差值編碼(適用於重復率高,但分布比較隨機的數據列)。

② HBase的列式存儲在查詢時如何讀取

hbase的region是按行劃分,而非按列,如果你讀取指定一行的所有列數據,regionServer雖然無法保證你的所有數據都在一個HFile中,但是至少是在一個Region中。但是具體的HFile所在的hdfs的節點那就不是HBase關心的事了,因為HBase的存儲是依賴與hdfs,所以底層存儲讀取的事會由NameNode操心,NameNode會考慮就近原則,而提供最高效的數據讀取策略。
你的數據傳輸是必然,但是HBase不會計算,計算是發生在你將想要的數據獲取到之後再自行進行計算的。你讀取大量數據必然會有大量數據傳輸,HBase只是將提供了一種高效的數據讀取策略,盡量減小數據傳輸量

③ 淺析Dremel中嵌套數據記錄的列式存儲

嵌套數據舉例如下,

圖1包含一個名為Document的數據結構的結構定義,即schema,以及兩個實例,r1和r2。定義數據結構的schema有三種修飾符,如下:

● required:表示有且僅有一個值

● optional:表示可選,0到1個值

● repeated:表示重復,0到N個值

所謂嵌套數據記錄其實是一種樹狀結構,圖2是數據記錄r1的樹形表示,其中葉子節點含有真正的值,欄位可以用完整路徑表示。圖1所示的例子Document總共有六個欄位,路徑分別為:

● DocId

● Links.Backward

● Links.Forward

● Name.Language.Code

● Name.Language.Country

● Name.Url

記錄按列存儲主要有正向拆解和反向構造兩個過程:

● 正向拆解:按照不同欄位對記錄進行拆解,相同欄位的值集中存儲為一列

● 反向構造:選擇任意欄位子集,重新構造為一個數據記錄

因為嵌套數據記錄的欄位有重復,對於重復欄位(repeated修飾)的多個值,在反向構造的時候,需要知道這些值是來自不同的記錄,還是來自相同記錄的重復欄位。最簡單的方式是引入一個「標志位」:0表示該值來自一個新的記錄,1表示相同記錄的重復欄位。

然而重復欄位是嵌套的,所以「相同記錄的重復欄位」包含多種情況,如圖1所示record1,Code(en)(表示value為en的Code欄位,下同)和Code(en-gb)都是記錄r1的重復欄位,它們在記錄中的位置還需進一步加以區分。考慮到欄位是用形如x.y.z…的路徑表示,所以重復欄位在記錄中的「位置」,可以表示為「該重復欄位出現在路徑哪一級」。如果記錄用樹表示,那麼所謂「路徑哪一級」指的就是樹的深度(levels)。需注意,路徑中非repeated修飾的欄位不參與深度計算。

比如Code欄位的路徑表示為Name.Language.Code,Name和Language都是重復欄位,如果在記錄中第一次出現,levels為0,如果在Name處重復出現,levels為1,在Language處重復出現levels為2。如Code(en)在Language處重復,所以levels為2;Code(en-gb)在Name出重復,所以levels為1。

又比如Forward欄位路徑為Links.Forward中,Links是optional的,不參與深度計算,Forward是repeated的,所以,如果在Forward處重復出現,levels為1(注意:不為2)。

這所謂的levels在Dremel中就是repetition levels,其定義如下:

「…  at what repeated field in the field』s path the

value has repeated.」

意思是「在路徑中的什麼重復欄位,此值重復了」,通俗來說就是「在哪一級重復」。

逐個讀取列存儲中的repetition

levels,就能夠初步還原value在原有數據中的位置,以欄位Name.Language.Code為例:

        1)第1個value是en-us,repetition levels=0表示沒有任何重復,表明這是一個新的record的開始,也表明en-us處在第1個Name的第1個Language。

        2)第2個value是en,repetition levels=2表示en在Language重復,也就是說不在Name處重復,表明和上一個值en-us處在同一個Name,即en處在第1個Name的第2個Language

        3)第3個value是NULL,repetition levels=1表示NULL在Name處重復,表明NULL處在一個新的Name,第2個Name。之所以要插入一個NULL值,為了計算出第4個value『en-gb』出現在第3個Name,否則的話就會被認為處在第2個Name

        4)第4個value是en-gb,repetition levels=1表示en-gb處在一個新的Name,即第3個Name

        5)第5個value是NULL,repetition levels=0表明這是一個新的記錄的開始

如果value不為NULL,通過repetition levels就能夠確定其所在位置。但如果value為NULL,僅有repetition levels還無法完全確定其所在位置。

以Name.Language.Country欄位為例,第3個value是NULL,repetition

levels=1表明當前NULL處在第2個Name(需要結合前面兩個value的repetition

levels計算得出)。但由於Name下面有兩級定義,Language和Country,Language是repeated類型的,重復次數可能為0,即可能沒有定義,Country是optional可選類型,也可能沒有定義,既然都有可能沒定義,僅有NULL就無法知道是在Language這一級NULL還是在Country這一級NULL。

因此,對於optional或repeated類型欄位,需要一個標示顯示的表明NULL型value定義在哪一級,這就是Dremel中的definition levels,定義如下:

「...how many fields in path that could be undefined (because they are

optional or repeated) are actually present in the record」

即「在路徑中有多少個可選欄位或重復欄位實際上是有值的」。

         以圖3所示Name.Language.Country為例進行說明:

● 第1個NULL value的definition levels為2,表示Name和Language有定義,Country沒有定義

● 第2個NULL value的definition levels為1,表示Name有定義,Language就沒有定義了

進一步看非NULL的value。Country為us和gb的value,其definition

levels為都3,表示Name、Language和Country都有定義。Name.Language.Code欄位,Code為required類型,Name和Language是repeated類型,所以Code欄位的definition levels取值1或2,value en-us、en、en-gb等definition levels為2,NULL value的defition為1。

不難發現,非NULL的value,其definition levels為路徑深度的最大值。NULL的value,其definition levels都小於路徑深度最大值。基於該特點,可以不用保存NULL value,僅保存其definition levels即可。

[1] Dremel論文

④ 列式資料庫的舉例

下面以GBase 8a分析型資料庫為例,描述列存儲對數據存儲與管理的作用。
面對海量數據分析的 I/O 瓶頸,GBase 8a 把表數據按列的方式存儲,其優勢體現在以下幾個方面。
不讀取無效數據:降低 I/O 開銷,同時提高每次 I/O 的效率,從而大大提高查詢性能。查詢語句只從磁碟上讀取所需要的列,其他列的數據是不需要讀取的。例如,有兩張表,每張表100GB 且有100 列,大多數查詢只關注幾個列,採用列存儲,不需要像行存資料庫一樣,將整行數據取出,只取出需要的列。磁碟 I/0 是行存儲的 1/10或更少,查詢響應時間提高 10 倍以上。
高壓縮比:壓縮比可以達到 5 ~ 20 倍以上,數據佔有空間降低到傳統資料庫的1/10 ,節省了存儲設備的開銷。
當資料庫的大小與資料庫伺服器內存大小之比達到或超過 2:1 (典型的大型系統配置值)時,列存的 I/O 優勢就顯得更加明顯;
GBase 8a 分析型資料庫的獨特列存儲格式,對每列數據再細分為「數據包」。這樣可以達到很高的可擴展性:無論一個表有多大,資料庫只操作相關的數據包,性能不會隨著數據量的增加而下降。通過以數據包為單位進行 I/O 操作提升數據吞吐量,從而進一步提高I/O效率。
由於採用列存儲技術,還可以實現高效的透明壓縮。
由於數據按列包存儲,每個數據包內都是同構數據,內容相關性很高,這使得GBase 8a 更易於實現壓縮,壓縮比通常能夠達到 1:10 甚至更優。這使得能夠同時在磁碟 I/O 和 Cache I/O 上都提升資料庫的性能,使 GBase 8a 在某些場景下的運算性能比傳統資料庫快 100 倍以上。
GBase 8a 允許用戶根據需要設置配置文件,選擇是否進行壓縮。在啟用壓縮的情況下GBase 8a 根據數據的不同特性以及不同的分布狀況,自動採用相應的壓縮演算法,如:
行程編碼(適用於大量連續重復的數據,特別是排序數據);
基於數據的差值編碼(適用於重復率低,但彼此差值較小的數據列);
基於位置的差值編碼(適用於重復率高,但分布比較隨機的數據列)。

⑤ 什麼是資料庫列存儲,原理是怎樣的

資料庫列存儲不同於傳統的關系型資料庫,其數據在表中是按行存儲的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因 此整個資料庫是自動索引化的。

按列存儲每個欄位的數據聚集存儲,在查詢只需要少數幾個欄位的時候,能大大減少讀取的數據量,一個欄位的數據聚集存儲,那就 更容易為這種聚集存儲設計更好的壓縮/解壓演算法。這張圖講述了傳統的行存儲和列存儲的區別:

⑥ 行式資料庫和列式資料庫的優缺點是什麼,行式資料庫和列式資料庫的執行效率比較一下

傳統的行式資料庫,是按照行存儲的,維護大量的索引和物化視圖無論是在時間(處理)還是空間(存儲)方面成本都很高。而列式資料庫恰恰相反,列式資料庫的數據是按照列存儲,每一列單獨存放,數據即是索引。只訪問查詢涉及的列,大大降低了系統I/O,每一列由一個線來處理,而且由於數據類型一致,數據特徵相似,極大方便壓縮。行式資料庫擅長隨機讀操作,列式資料庫則更擅長大批量數據量查詢

⑦ hdfs 列式存儲和行式存儲的區別

列式資料庫是將同一個數據列的各個值存放在一起。插入某個數據行時,該行的各個數據列的值也會存放到不同的地方。

列式存儲: 每一列單獨存放,數據即是索引。

只訪問涉及得列,如果我們想訪問單獨一列(比如NAME)會相當迅捷。

一行數據包含一個列或者多個列,每個列一單獨一個cell來存儲數據。而行式存儲,則是把一行數據作為一個整體來存儲。

在HANA的世界中,並不是只存在列式存儲,行式存儲也是存在的。

各自的優缺點:

⑧ pandas中查看數據類型的幾種方式

在獲得數據之後、分析數據之前,我們一般需要對數據總體進行一個概覽,如有哪些欄位,每個欄位的類型,值是否缺失等,以下列出了幾種方法,供我們方便快捷的查看dataframe的數據類型。

1、維度查看:df.shape

返回結果如下如所示,說明此表格一共有20w+行,16列:

2、數據表基本信息(維度、列名稱、數據格式、所佔空間等):df.info()

返回結果如圖,可見,用info方法可以非常全面的看出表格的各項屬性,包括:
1.表格的維度:203401行 * 16列,RangeIndex:0-203400
2.表格的列名,是否為空值和列欄位類型dtype(後面我會給出pandas的數據類型和Python數據類型的匹配關系圖!!!)
3.表格所佔空間:24.8M+

3、每一列數據的格式:df.dtypes
這個功能與df.info()類似,如果只想查看每一列存儲的是什麼數據格式,那麼可以直接使用df.dtypes

返回結果如圖,可以看到,這個結果基本就是df.info()的簡化版,指明了各列的數據類型。

4、某一列格式:df['B'].dtype
分析過程中,由於欄位繁多,所以用到某欄位時需要適時查看,同樣可以運用dtype,此處不再贅述。

由上文可見,float64,int64,object都是pandas專有的數據格式,同理,Python,numpy都有自己的一套數據格式,它們之間的對應關系可參考下面的表格:

這里需要強調的是object類型實際上可以包括多種不同的類型,比如一列數據里,既有整型、浮點型,也有字元串類型,這些在pandas中都會被標識為『object』,所以在處理數據時,可能需要額外的一些方法提前將這些欄位做清洗,str.replace(),float(),int(),astype(),apply()等等。

如果覺得有用,給我點個贊吧,你的支持就是對我最大的鼓勵!ღ( ´・ᴗ・` )❥

⑨ hive存儲parquet表

parquet格式的表在生產環境中經常被使用到,具有列式存儲和壓縮等特點,我們怎麼在hive中存儲parquet格式的表呢。

這里使用oracle的emp表

載入本地數據到hive表

執行查詢

發現報錯

emp使用parquet格式存儲,其中imputFormat和outputFormat都是parquet的相關的,也就是我的imputFormat是parquent的,但是你傳過來的是text,我不認識
我們看一下emp的相關信息,可以看到這里的都是parquet的format的,這是導致這次錯誤的原因。

這就導致了我們需要每次都先把text文件轉化為parquet的文件,然後parquent表進行載入才可以,下面介紹官方推薦的使用方法。

查看emp_tmp的表的信息,這里可以看到,默認的是TextImputFormat和TextOutputFormat的。

然後載入數據到emp_tmp,查看數據,是正常顯示的

然後現在把之前的emp裡面的數據給刪除

然後把emp_tmp表裡面的數據載入到emp

查詢一下,數據正常顯示,這個方式使用起來還行,就是每次都需要對臨時表進行操作,還是比較麻煩的。

感覺這個問題是經常出現,為什麼會這樣呢。這個和hive的版本有一定的關系。

可以看出hive官方將inputformat和outputformat進行了整合,這樣使用起來也是比較方便的。
但是可能有人想,那我修改inputformat不就行了,下面我介紹一下,看是否可以

創建emp2表,是parquet的存儲格式的

修改inputformat 和serde,這里inputFormat是TextInputFormat,SEDE使用的是LazySimpleSerDe,Outputformat任然是Parquet的,這里需要帶上。

查看emp2表的信息,如下圖表示修改成功

載入數據到emp2

查詢數據,執行成功

到這里,修改inputformat和serde的方法也介紹完成了,我們以為成功了,但是上hdfs上一看,文件還是txt格式的,所以通過修改inputformat和serde的方法不行。

肯定有人想使用這個方法
這個方法我也嘗試了,但是返回的值全都是null

  在僅僅使用hive的時候,如果想把txt文件裡面的數據保存到parquet表裡面的話,可以使用建立臨時表的方法,這個方法也是比較好操作的。
  但是其實如果使用spark,flink等分布式計算引擎的話,是可以直接的讀取txt數據保存到parquet表裡面的,框架幫我們做了轉化。這種方式也是我們在工作中經常使用的。
  上面也介紹了修改inputformat和ser的方式,秀給inputformat是可以讓txt文件裡面的數據被讀進來的,如果同時還修改了serde為lazysimpleserde的話,這個是把數據保存為text格式的,已經完全和parquet沒有關系了,保存的文件還是txt格式的。僅修改inputformat,但是使用的serde是parquet的,但是數據進出不一致,也是有問題的。

⑩ 什麼是列式存儲資料庫

列式資料庫是以列相關存儲架構進行數據存儲的資料庫,主要適合與批量數據處理和即席查詢。
GBase 8a 分析型資料庫的獨特列存儲格式,對每列數據再細分為「數據包」。這樣可以達到很高的可擴展性:無論一個表有多大,資料庫只操作相關的數據包,性能不會隨著數據量的增加而下降。通過以數據包為單位進行 I/O 操作提升數據吞吐量,從而進一步提高I/O效率。

由於採用列存儲技術,還可以實現高效的透明壓縮。