Google Dremel和parquet的復雜嵌套數據結構表征方法解析

轉載請注明出處。作者:archimekai
核心參考文獻: Dremel: Interactive Analysis of Web-Scale Datasets

文章目錄

  • 引言
  • 復雜嵌套數據結構的無損表征問題
  • Dremel論文中提出的表征方法
  • parquet
  • 備注

引言

Dremel是Google的交互式分析系統。Google大量采用protobuf格式,因此Dremel必須支持protobuf這種復雜嵌套格式的分析。眾多工作已經論證了列式存儲格式對分析系統(AP, analytical processing)的重要性,因此Dremel需要把復雜嵌套格式存儲為列存。本文接下來重點分析Dremel是如何把復雜嵌套格式轉換為每一列單獨存儲的。

我們的目標是:沒有蛀牙(劃掉)把相同字段的所有值連續存儲。因此需要設計一種能夠適用于任意protobuf/json格式的,無損的數據表征方式。

復雜嵌套數據結構的無損表征問題

不同的數據,其表征難度是不同的。最簡單的是完全沒有嵌套,平鋪直敘的數據。這種數據只要將每一個字段的名稱取出,放在數據庫中作為一列即可。
數據樣例如下:

{"Code": "en-us", "Country": "us"}

一種表征方式如下:

CodeCountry
en-usus

如果數據中有嵌套,但是沒有列表,也比較簡單。只需要用某個分隔符(例如 . )把嵌套的字段名稱連接起來即可。以下面的數據為例:

{"DocId": 10, "Links": {"Forward": 20}}

其一種表征方式如下:

DocIdLinks.Forward
1020

如果數據中存在列表,就比較復雜了。這里的難點在于,列表的長度無法提前預知,所以一般不能把列表中的每一個元素都作為一列存儲。例如

{"Links": {"Backward": [10,30], "Forward": [80]}}

不能表征為

Links.Backward[0]Links.Backward[1]Links.Forward[0]
103080

如果將來Backward中有10000個元素就很難處理。

這個問題其實有一個簡單場景,即列表中的元素都是相同的基本數據類型。這里的基本數據類型可以簡單理解為數據庫有原生數組類型支持的數據類型,例如 int ( int[] ),float ( float[] )等,因此,上述數據可以表征為下表。Hologres就是采用了這樣的方案。

Links.BackwardLinks.Forward
[10.30][80]

通過上面的方案,筆者認為已經可以搞定80%以上的場景了。但是如果列表中的元素不是基本數據類型,上面的的方案就又搞不定了。考慮下面的數據:

{"Name": [{"url": "http://C", "long_data": "data"}]}

在這個例子中,數組里面的元素是{"url": "http://C"},并不是一種基本數據類型,如何存儲才能支撐對Name.url的高效查詢呢?。除了上面的例子,還有更為復雜的數組套數組的例子:

{"Name": [{"Language":[{"Code": "en-us", "Country": "us"}, {"Code": "en"}]}]}

那么,有沒有一種方法可以一勞永逸地搞定所有protobuf/強類型json(強類型json指每個字段的類型是確定的)能夠表達的所有數據呢?還真有,這就是Google的天才工程師們在Dremel論文中提出的方案。下面筆者重點介紹這個方案。

Dremel論文中提出的表征方法

還是看上面數組套數組的例子,主要的困難點是,讀取數據時如何確定內層元素(例如{"Code": "en"})的位置?這需要準確表達內層元素在當前數組(也即Language)和父數組(也即Name)中的位置,才能在讀取時把數據結構還原回來。這提示我們,至少需要增加兩個位置信息才行。
Google的工程師們也是這么想的,他們定義了兩個變量來表示上述信息,這兩個變量也是理解Dremel數據表征算法的關鍵:

  • 第一個變量是repetition level,簡稱r,其表示對于給定的字段,其當前在哪一個級別重復。這個概念比較抽象,請結合下面的例子仔細閱讀備注進行理解。
  • 第二個變量是definition level,簡稱d,其表示對于給定的字段,其前面有多少個字段是存在的。例如,r3中的DocId,d=0,也即DocId更上層沒有字段了,r3中的Links.Forward字段,d=1,也即Links這個字段是存在的。

可以看到,r和d并非直接表示當前數組和父數組的位置,而是以一種類似增量(在當前級別重復還是在哪個級別重復)的方式進行編碼。

一個加料版的例子(r3,基于論文中的r1修改而來)。數據schema如下

message Document { 
required int64 DocId; optional group Links { 
repeated int64 Backward; 
repeated int64 Forward; } 
repeated group Name { repeated group Language { 
required string Code; 
optional string Country; } 
optional string Url; }} 

數據如下(簡稱r3)

{"DocId": 10, "Links": {"Forward": [20,40,60]}, "Name": [{"Language": [{"Code": "en-us", "Country": "us"},{"Code": "en"},{"Code": "zh-cn", "Country": "cn"}]"Url": "http://A"},{"Url": "http://B"},{"Language": [{"Code": "en-us", "Country": "gb"}]}]
}

數據r3中的Name.Language.Country字段編碼后如下。

valuerd備注
us02r=0表示r3這篇文檔的第一個Country字段,d=2表示Name, Language兩個字段都是存在的
null22r=2表示Language字段在第二級,也即Language數組這一級重復,null表示Country字段實際上未在Language這個數組的第二個元素{"Code": "en"}中出現。注意null在dremel的編碼方式中是必須的
cn22r=2表示Language字段在第二級,也即Language數組這一級重復,出現在Language這個數組的第三個元素
null11r=1表示Language字段在第一級,也即Name數組這一級重復,null表示Country字段實際上為在Name這個數組的第二個元素{"Url": "http://B"}中出現。結合d=1可知,Name.Language.Country中只有頭一個字段,也即Name存在,Language字段不存在。
gb12r=1表示Language字段在第一級,也即Name數組這一級重復,出現在Name數組的第三個元素

到了這里,相信讀者已基本理解了r和d的含義。筆者將Dremel論文中的原圖貼在這里,大家應該可以看懂了。
Dremel論文原文中的例子

parquet

parquet中對于嵌套數據的數據和Google Dremel基本一致。本篇文章不詳細展開

備注

  • 為了方便理解,上述描述中省略了一些不重要的細節,感興趣的讀者可自行閱讀論文原文。
  • 本篇文章只介紹了最核心的數據結構表征方式,Dremel論文中還有關于如何將各個字段拆分為列,如何使用有限狀態自動機真正生成r和d值的描述,以后有機會再介紹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717914.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全量知識系統問題及SmartChat給出的答復 之17 知識系統中的兩個特權類(超類和欠類) :腳本和場景

Q.45 知識系統中的兩個特權類 :腳本和場景 知識系統中的兩個特權類(也是集合論中兩個特權集合):腳本script和場景scene 。 一個$Demonstrate類型的腳本script: 表示“值val”( 形式上是應用程序的實用工…

如何學習openfoam

學習OpenFOAM的詳細步驟、流程、學習網站、練習案例以及B站學習資源推薦如下: 一、詳細步驟和流程 安裝OpenFOAM:首先,你需要在你的計算機上安裝OpenFOAM。你可以從OpenFOAM的官方網站下載適合你的操作系統的安裝包,然后按照官方提…

搭建服務器及跨域處理

使用內置的模塊搭建服務器 自己電腦: 域名:localhost ip:127.0.0.1 http模塊搭建服務器 const http = require(http)// 創建一個http對應的服務器,每次改完服務器的代碼后都需要重新啟動下服務器 /*方式一: const server = http.createServer((request,response)=>{…

對簡單工廠模式、工廠方法模式的思考

目錄 1 背景1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 輸入示例1.5 輸出示例 2 簡單工廠模式3 工廠方法模式4 思考4.1 改進工廠方法模式 1 背景 題目源自:【設計模式專題之工廠方法模式】2.積木工廠 1.1 題目描述 小明家有兩個工廠,一個用于生產圓形積木…

鐵路關基保護新規發布!鐵路軟件供應鏈安全洞察與治理思路

近日,國家鐵路局發布《鐵路關鍵信息基礎設施安全保護管理辦法》,《辦法》第十四條提到:“運營者應當加強鐵路關鍵信息基礎設施供應鏈安全保護,優先采購安全可信的網絡產品和服務。運營者采購網絡產品和服務,應當預判該…

Intel FPGA IP之LVDS SerDes IP學習

FPGA 視頻數據輸入輸出直通工程: 屏:13.2吋8bit色深,屏幕分辨率為1440*192060,具有兩個Port,每個Port有4個差分數據對與1個差分時鐘對,差分對均支持LVDS協議芯片:Cyclone V系列FPGA目的&#x…

標簽轉格式問題之——xml_2_txt.py

import xml.etree.ElementTree as ET#xml 是python自帶的package import osclasses[walnut]#寫自己的分類名 pre_dirF:/2023walnut/labels#xml文件所在文件夾 target_dirF:/2023walnut/yolo#想要存儲txt文件的文件夾 pathos.listdir(pre_dir)for path1 in path: # path1rC:\Use…

[變壓器故障診斷分類及預測】基于Elman神經網絡

課題名稱:基于Elman神經網絡的變壓器故障診斷分類及預測 版本日期:2024-02-10 運行方式:直接運行Elman0507.m文件 代碼獲取方式:私信博主或QQ:491052175 模型描述: 對變壓器油中溶解氣體進行分析是變壓…

Noise Conditional Score Networks(NCSN)學習

參考: [1] https://zhuanlan.zhihu.com/p/597490389 [2] https://www.zhangzhenhu.com/aigc/Score-Based_Generative_Models.html TOC 1 基于分數的生成模型1.1 簡介和動機1.2 Score Matching及其改進1.2.1 Score Matching1.2.2 Sliced score matching(不…

XSS_lab(level1-level5)

level1 直接輸入頁面沒有發現輸入框&#xff0c;觀察url發現有傳參 嘗試修改傳參為&#xff1a;<script>alert(1)</script> 過啦&#xff01; level2 頁面中有輸入框&#xff0c;嘗試構建語句&#xff1a;<script>alert(1)</script>,傳輸后查看源代…

國際心理學導師-葉子文JeffreyYip的《意識地圖》

“物質就是能量。” ---愛因斯坦 “時常保持覺知&#xff0c;有意識地發現情緒起伏 你隨時都能翻轉人生 做自己人生的導演 當你頻率高時&#xff0c;萬事萬物為你而來” ---大衛霍金斯 葉子文-《意識地圖》&#xff1a;高階心理學課程 宇宙間萬物的本質是能量。一切都靠能量…

Java基礎---lambda表達式

一、為什么要引入lambda表達式 lambda 表達式是一個可傳遞的代碼塊 &#xff0c; 可以在以后執行一次或多次 。 在介紹lambda表達式之前&#xff0c;我們看一下&#xff0c;以前&#xff0c;我們對于一個問題的通常寫法。 假設你已經了解了如何按指定時間間隔完成工作&#xf…

js字符串轉json的3種方法

1.eval方式解析 function strToJson(str){var json eval("(" str ")");return json;}console.log(strToJson("{int:1, string:demo}")); 運行截圖&#xff1a; 注&#xff1a; 記得別忘了str兩旁的小括號。 永遠不要使用 eval !!! eval() 是一…

611. 有效三角形的個數 - 力扣

1. 題目 給定一個包含非負整數的數組 nums &#xff0c;返回其中可以組成三角形三條邊的三元組個數。 2. 示例 3. 分析 利用已升序了的數組通過 a b > c 這條公式找出符合要求的三元組&#xff0c;利用這個公式的前提是三條邊為從小到大&#xff0c;再利用單調性快速統計…

STM32 (1)

1.基本信息 stm32是由ST公司生產的一種32位微控制器&#xff08;單片機&#xff09;。 1.1 各種型號 stm32是32位單片機的總稱&#xff0c;有多種不同的系列。 32即用32個比特位表示一個地址&#xff0c;尋址范圍&#xff1a;0x00000000 --0xffffffff (4GB) 1.2 存儲密度 …

Mysql事務的兩段式提交

binlog和redo log區別 為了滿足Mysql的事物ACID特性&#xff0c;InnoDB引入了redo log和 undo log日志文件。為了滿足主從同步Mysql引入了binlog日志文件。redo log和binlog文件都保存的數據庫對數據庫的修改&#xff0c;但是binlog和redo log本質上是不一樣的&#xff1a; r…

UE5中實現后處理深度描邊

后處理深度描邊可以通過取得邊緣深度變化大的區域進行描邊&#xff0c;一方面可以用來做角色的等距內描邊&#xff0c;避免了菲尼爾邊緣光不整齊的問題&#xff0c;另一方面可以結合場景掃描等特效使用&#xff0c;達到更豐富的效果&#xff1a; 后來解決了開啟TAA十字線和鋸齒…

XXL-Job的基本使用

一、市面上常見的任務調度產品 針對分布式任務調度的需求&#xff0c;市場上出現了很多的產品: 其中XXL-job 是我們經常使用的任務調度平臺,XXL這三個英文字母.是以作者名許雪里命名的。 可以前往 Gitee 地址進行下載使用 https://gitee.com/xuxueli0323/xxl-job.git二、XXL-J…

使用`paddle.nn.Layer`自定義網絡教程

文章目錄 使用paddle.nn.Layer自定義網絡教程1. 概念介紹2. 數據處理3. 搭建一個完整的深度學習網絡4. 使用paddle.nn.Layer構建深度學習網絡5. 利用paddle.nn.Layer進行子層的訪問6. 修改paddle.nn.Layer層的成員變量7. 存儲模型的參數8. 總結 使用paddle.nn.Layer自定義網絡教…

LockBit病毒入侵揭秘:如何防范與應對

在數字時代&#xff0c;隨著科技的飛速發展&#xff0c;網絡安全問題愈發凸顯。惡意軟件和勒索軟件等網絡威脅正不斷演變&#xff0c;其中一款備受關注的勒索軟件就是LockBit。本文將深入介紹LockBit的特征、攻擊手段、演進歷程以及對網絡安全的威脅。 01 主要特征 LockBit是…