欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

記錄的列狀存儲表示的制作方法

文檔序號:6360344閱讀:303來源:國知局

專利名稱::記錄的列狀存儲表示的制作方法
技術領域
:本文檔總體上描述了用于生成并處理記錄的列狀存儲表示的技術、方法、系統(tǒng)和機制。
背景技術
:本公開總體上涉及大規(guī)模分析數(shù)據(jù)處理。這樣的數(shù)據(jù)處理在網(wǎng)絡公司中且跨產(chǎn)業(yè)已經(jīng)變得非常普遍,尤其是由于使得能夠采集大量商業(yè)關鍵數(shù)據(jù)的低成本存儲。將該數(shù)據(jù)放在分析師和引擎的指尖已經(jīng)顯得越來越重要;交互響應時間經(jīng)常在數(shù)據(jù)探測、監(jiān)視、在線消費者支持、快速成形、數(shù)據(jù)管線調(diào)試和其它任務中形成質量差異。按規(guī)模執(zhí)行交互式數(shù)據(jù)分析要求高度并行、例如,使用當今的商品磁盤在一秒鐘內(nèi)讀取一兆兆字節(jié)的壓縮數(shù)據(jù)將需要數(shù)萬個磁盤。類似地,CPU密集查詢可能需要在數(shù)千個核上運行以在數(shù)秒之內(nèi)完成。
發(fā)明內(nèi)容這里公開了一種用于數(shù)據(jù)分析的可擴展、交互式ad-hoc查詢系統(tǒng)。通過將多級執(zhí)行樹與列狀逐句布局相結合,所描述的系統(tǒng)和方法能夠運行諸如整合查詢之類的快速且高效的查詢。描述了用于嵌套記錄的列狀存儲表示,所述嵌套記錄是可以在許多網(wǎng)絡規(guī)模和科學數(shù)據(jù)集中使用的流行數(shù)據(jù)模型。依據(jù)一個實施例,記錄被分解為列條帶,每個列被編碼為塊的集合,每個塊包含字段值以及重復和定義級別信息。級別信息使用字段寫入器(writer)的樹生成,其結構與記錄模式中的字段層級相匹配。可以有效地使用有限狀態(tài)機從列狀數(shù)據(jù)組成記錄,該有限狀態(tài)機讀取字段數(shù)據(jù)以及每個字段的級別信息并且將值順序附加至輸出記錄。如果僅字段的子集需要被獲取,則能夠構造其執(zhí)行更為廉價更為簡單的有限狀態(tài)機。此外通過利用列狀存儲表示存儲諸如約束信息之類的附加元數(shù)據(jù),能夠支持附加類型的查詢。多級服務樹被用來執(zhí)行查詢。在一個實施例中,根服務器接收傳入的查詢,從表讀取元數(shù)據(jù),并且將該查詢路由至服務樹中的下一級別。葉服務器與存儲層進行通信并且訪問本地存儲上的數(shù)據(jù),其中所存儲的數(shù)據(jù)能夠被復制,并且讀取列狀表示中嵌套數(shù)據(jù)的條帶。每個服務器可以具有對應于物理查詢執(zhí)行計劃的內(nèi)部執(zhí)行樹,其包括對輸入列進行掃描并且發(fā)出利用級別信息進行注釋的聚集和標量函數(shù)的結果的迭代器集合。在另一個實施例中,提供查詢分派器,其基于查詢的屬性對它們進行調(diào)度并且平衡負載。查詢分派器在一個服務器變得明顯比其它服務器更慢或者當副本(replica)變?yōu)闊o法訪問時提供容錯。查詢分派器能夠計算葉服務器上的執(zhí)行線程的處理時間的直方圖并且當處理時間占用不成比例的時間量時重新調(diào)度至另一個服務器??梢跃偷貙α袪顢?shù)據(jù)進行查詢。將列狀數(shù)據(jù)在普通存儲層上維護并且提供機制以對來自列狀數(shù)據(jù)的記錄進行整合支持對記錄結構的數(shù)據(jù)進行分析的數(shù)據(jù)管理工具的可操作性。該系統(tǒng)可以為數(shù)個處理器的規(guī)模并且能夠快速讀取大量數(shù)據(jù)。在某些實例中,特定實施例能夠被實施為實現(xiàn)以下的一種或多種優(yōu)勢。嵌套數(shù)據(jù)可以在原地進行操作,以使得數(shù)據(jù)可以被訪問而并不利用數(shù)據(jù)庫管理系統(tǒng)加載該數(shù)據(jù)??梢砸员绕渌治龀绦蛩璧臅r間有所減少的執(zhí)行時間來執(zhí)行嵌套數(shù)據(jù)的查詢。在普通存儲層上實現(xiàn)的列狀存儲數(shù)據(jù)結構使得多個不同分析程序能夠訪問該列狀存儲數(shù)據(jù)結構。作為所附權利要求以及以上描述中所描述實施例的備選,本發(fā)明也可以通過以下實施例之一進行描述實施例1針對一種計算機實施的方法。該方法包括由計算系統(tǒng)訪問存儲在計算機存儲器中的數(shù)據(jù)記錄的集合,該數(shù)據(jù)記錄集合中的每個記錄包括多個數(shù)據(jù)值以及標識出來自該多個數(shù)據(jù)值的對應數(shù)據(jù)值的語義的多個數(shù)據(jù)元素,該數(shù)據(jù)記錄集合中的一個或多個數(shù)據(jù)記錄中的每個包括相同數(shù)據(jù)元素的多個實例,并且包括對應于該相同數(shù)據(jù)元素的多個實例的數(shù)據(jù)值。該方法進一步包括由計算機系統(tǒng)生成列狀條帶的集合,該列狀條帶集合包括來自數(shù)據(jù)記錄集合中的每個數(shù)據(jù)記錄的數(shù)據(jù)值,該列狀條帶集合中的每個列狀條帶包括對應于來自記錄集合中的每個記錄的具體數(shù)據(jù)元素的所有數(shù)據(jù)值。實施例2針對實施例1的方法。該方法進一步包括由計算系統(tǒng)且對于列狀條帶集合中的每個列狀條帶中的每個數(shù)據(jù)值生成識別來自該數(shù)據(jù)記錄集合的相應數(shù)據(jù)記錄中的相應數(shù)據(jù)值的位置的數(shù)據(jù)。實施例3針對實施例2的方法,其中該數(shù)據(jù)由重復值和定義值所構成。實施例4針對實施例2至3中任一項的方法。該方法進一步包括從(i)列狀條帶集合中的列狀條帶,和(ii)數(shù)據(jù)來重構僅包含來自該數(shù)據(jù)記錄集合中的記錄的數(shù)據(jù)元素子集的記錄集合。實施例5針對實施例1至4中任一項的方法,進一步包括生成該列狀條帶集合中的每個特定數(shù)據(jù)值的重復值,以與該列狀條帶集合中的數(shù)據(jù)值一起存儲,其中每個特定數(shù)據(jù)元素的路徑包括對該特定數(shù)據(jù)元素的任意一個或多個父數(shù)據(jù)元素;其中每個特定數(shù)據(jù)值的重復值標識出對應于特定數(shù)據(jù)值的特定數(shù)據(jù)元素的路徑中最近重復的數(shù)據(jù)元素;其中特定數(shù)據(jù)元素的路徑中的該最近重復過的數(shù)據(jù)元素是在包括該特定數(shù)據(jù)值的特定數(shù)據(jù)記錄的分析期間在特定數(shù)據(jù)元素的路徑中第二次遇到的數(shù)據(jù)元素,該分析從特定數(shù)據(jù)值在特定數(shù)據(jù)記錄中的位置向上朝著特定數(shù)據(jù)記錄的開始進行。實施例6針對實施例1至5中任一項的方法,其中該數(shù)據(jù)元素集合中所包括的數(shù)據(jù)元素中的每個特定數(shù)據(jù)元素與包括對該特定數(shù)據(jù)元素的任意一個或多個父數(shù)據(jù)元素的相應路徑相關聯(lián)。該方法進一步包括生成該數(shù)據(jù)記錄集合中的每個特定路徑或特定路徑部分的定義值,以與該列狀條帶中的數(shù)據(jù)值一起存儲。特定路徑或特定路徑的部分的定義級別標識出該特定路徑或路徑的部分中所包括的數(shù)據(jù)元素的數(shù)量。實施例7針對實施例1至6中任一項的方法。該方法進一步包括由計算系統(tǒng)從數(shù)據(jù)源集合接收信息,每個數(shù)據(jù)源包括未根據(jù)模式而結構化的信息。該方法進一步包括由計算系統(tǒng)通過根據(jù)該模式對每個數(shù)據(jù)源中的信息進行結構化而生成該數(shù)據(jù)記錄集合中的每個數(shù)據(jù)記錄。實施例8針對實施例1至7中任一項的方法。該方法進一步包括由計算系統(tǒng)執(zhí)行對該列狀條帶集合的查詢。該方法進一步包括由計算系統(tǒng)且響應于查詢的執(zhí)行而輸出新的列狀條帶,該新的列狀條帶包括來自由該查詢所標識出的列狀條帶集合的列狀條帶的值的子集。實施例9針對實施例8的方法。其中執(zhí)行該列狀條帶集合的查詢而并不將該列狀條帶集合中所包括的數(shù)據(jù)值加載到數(shù)據(jù)庫中。實施例10針對實施例1至9中任一項的方法,其中該列狀條帶集合的至少第一列狀條帶包括多個數(shù)據(jù)塊,該多個數(shù)據(jù)塊中的至少一些數(shù)據(jù)塊中的每個包括定義了在每個塊的值中所找到的值類型的聲明值,從而使得在執(zhí)行第一列狀條帶的查詢時,該計算系統(tǒng)避免不包括由該查詢所指定的數(shù)據(jù)值的一個或多個數(shù)據(jù)塊。實施例11針對實施例1至10中任一項的方法,其中該列狀條帶集合的第一列狀條帶包括來自該數(shù)據(jù)記錄集合中的對應于該數(shù)據(jù)記錄集合中的第一數(shù)據(jù)元素的實例的數(shù)據(jù)記錄中的所有數(shù)據(jù)值,作為第一數(shù)據(jù)值。該第一列狀條帶在存儲器中連續(xù)存儲多個第一數(shù)據(jù)值,其中多個第一數(shù)據(jù)值在多個第一數(shù)據(jù)值存儲在該數(shù)據(jù)記錄集合中的數(shù)據(jù)記錄中時,并不在存儲器中連續(xù)存儲。實施例12針對實施例1至11中任一項的方法,其中該數(shù)據(jù)記錄集合中的至少一個數(shù)據(jù)記錄包括根據(jù)嵌套數(shù)據(jù)模型所存儲的數(shù)據(jù)元素和對應的數(shù)據(jù)值。實施例13針對實施例1至12中任一項的方法,其中第一數(shù)據(jù)記錄包括第一數(shù)據(jù)元素和第二數(shù)據(jù)元素,第一數(shù)據(jù)元素是第二數(shù)據(jù)元素的父數(shù)據(jù)元素,并且第二數(shù)據(jù)元素是第一數(shù)據(jù)元素的子數(shù)據(jù)元素。第一列狀條帶包括對應于第一數(shù)據(jù)記錄中的第一數(shù)據(jù)元素的數(shù)據(jù)值以及對應于該數(shù)據(jù)記錄集合中的第一數(shù)據(jù)元素的實例的所有其它數(shù)據(jù)值。第二列狀條帶包括對應于第一數(shù)據(jù)記錄中的第二數(shù)據(jù)元素的數(shù)據(jù)值以及對應于該數(shù)據(jù)記錄集合中的第二數(shù)據(jù)元素的實例的所有其它數(shù)據(jù)值。其它實施例包括存儲指令的相對應計算機可讀存儲設備,當上述指令被一個或多個處理設備(例如,可編程計算機處理器)所執(zhí)行時,執(zhí)行根據(jù)以上所描述的實施例1至13中任一項的操作。其它實施例包括系統(tǒng)和裝置,其包括所描述的存儲指令的計算機可讀存儲設備,當被一個或多個處理設備所執(zhí)行時,上述指令執(zhí)行根據(jù)以上所描述的實施例1至13中任一項的操作。附圖和以下的描述中給出了一個或多個實施例的細節(jié)。本發(fā)明的其它特征、目標和優(yōu)勢將由于描述和附圖以及權利要求而明顯。圖1圖示了嵌套數(shù)據(jù)按照記錄的(record-wise)對比列狀表示。圖2圖示了兩個樣本嵌套記錄及其模式。圖3圖示了樣本嵌套記錄的列狀條帶表示。圖4是用于將記錄劃分為列的算法。圖5圖示了用于執(zhí)行完整的記錄聚集的自動機。圖6圖示了用于從兩個字段聚合記錄的自動機,以及該自動機所產(chǎn)生的記錄。圖7用于構建記錄聚合自動機的算法。圖8是用于從列狀數(shù)據(jù)整合記錄的算法。圖9描繪了執(zhí)行投影、選擇和記錄內(nèi)聚合的樣本查詢。圖10圖示了服務器節(jié)點內(nèi)的系統(tǒng)架構和執(zhí)行。圖11是圖示實驗研究中所使用的數(shù)據(jù)集的表。圖12是圖示可在從本地磁盤進行讀取時可能發(fā)生的性能崩潰的圖。圖13是圖示MapReduce和所描述系統(tǒng)在面向列狀對比面向記錄的存儲上的執(zhí)行圖14是圖示作為兩個聚合查詢的服務樹級別的函數(shù)的執(zhí)行時間的圖。圖15是圖不處理時間的直方圖的圖。圖16是圖示當系統(tǒng)規(guī)模使用前k個查詢從1000縮放為4000個節(jié)點時的執(zhí)行時圖17是圖示作為每個板塊(tablet)的處理時間的函數(shù)的所處理表的百分比的的圖。間的圖。圖。圖18是圖示每月工作負載中的查詢響應時間分布的圖。圖19是用于生成并處理嵌套記錄的列狀存儲表示的系統(tǒng)的框圖。圖20是用于生成列狀數(shù)據(jù)的示例過程的流程圖。圖21是作為客戶端或者作為一個或多個服務器的可以用來實現(xiàn)本文中所描述的系統(tǒng)和方法的計算設備的框圖。各圖中同樣的附圖標記指代同樣的要素。具體實施例方式本文檔描述了用于生成并處理記錄的列狀存儲表示的技術、方法、系統(tǒng)和機制。作為說明,組織可以在嵌套信息的記錄中存儲來自網(wǎng)頁的數(shù)據(jù)。該嵌套信息可以以列狀數(shù)據(jù)存儲格式進行編譯,其使得能夠使用多級執(zhí)行樹進行有效的數(shù)據(jù)查詢。列狀數(shù)據(jù)可以被重新整合為記錄以便輸入到對面向記錄的數(shù)據(jù)進行操作的分析程序。更具體地,每個記錄可以是定義記錄的格式的模式的實例化,其中記錄依據(jù)模式而創(chuàng)建。例如,模式可以標識出用于存儲關于網(wǎng)頁的信息的各個字段以及用于以記錄及其相對應值對字段進行組織的結構。當生成用于描述網(wǎng)頁特征的記錄時,針對每個字段,記錄可以包括數(shù)據(jù)元素和相對應的值。數(shù)據(jù)元素可以依據(jù)模式中的定義來定義值的語義。術語數(shù)據(jù)元素和字段在本文檔中可以互換使用。字段還指數(shù)據(jù)元素和相對應值的組合。特定記錄可以無需包括模式所定義的所有字段。因此,模式可以充當可以從中為特定記錄選擇字段的“模板”。例如,模式可以包括用于關于網(wǎng)頁中的視頻內(nèi)容的信息的字段。如果網(wǎng)頁并不包括視頻內(nèi)容,則對應于該網(wǎng)頁的記錄可以不包括來自模式的定義與網(wǎng)頁上的視頻相關的信息的字段。因此,一些字段可以是“可選的”。然而,記錄中的一些字段可能是“要求的”。例如,模式中的“要求”字段可以是提供網(wǎng)頁的文檔的資源位置的統(tǒng)一資源定位符(URL)。由于可以從資源位置獲取每個網(wǎng)頁文檔(即,存在可用于每個文檔的URL)并且由于字段可能被要求對網(wǎng)頁上的信息進行進一步處理(例如,確定內(nèi)容是否已經(jīng)改變),所以字段可能是要求的。字段還可能是“可重復的”。處于模式中并且被定義為可重復的字段可以在模式的實例化中(即,在記錄中)反復在該模式所定義的位置進行重復。例如,模式可以包括用于定義鏈接至網(wǎng)頁的文檔的字段。該模式可以僅指定該字段單次,但是可以指示該字段是可重復的(例如,由于若干文檔可以鏈接至特定網(wǎng)頁)。因此,網(wǎng)頁的記錄可以包括標識出鏈接網(wǎng)頁的值的多個字段。重復字段可以位于相同級別并且嵌套在記錄中的父字段之下(如以下更為詳細討論的)。模式的字段(以及因此是記錄中的字段)可以是嵌套的。換句話說,在一些字段可以是被稱之為父字段、祖父母字段等的其它字段的孩子。在一些示例中,子節(jié)點是模式中在緊隨父節(jié)點之后的一對開放或閉合花括號之內(nèi)所找到的節(jié)點。然而,可以對嵌套利用其它實施方式(例如,使用字段的開始標簽和字段的結束標簽)。因此,除了處于最高級別的字段(例如,并非任何其它字段的孩子的字段)之外,每個字段都可以具有父字段。嵌套對于將信息組織為概念上相關的信息塊是有幫助的。返回之前的示例,模式可以包括“Video”字段。“Video”字段可以包括可以標識出視頻特征(例如,視頻有多長,視頻的格式以及視頻的分辨率)的若干子節(jié)點。因此,當記錄被構建時,如果它們的父節(jié)點沒有出現(xiàn),則子節(jié)點可以不被置于記錄之中。換句話說,并不包括視頻的網(wǎng)頁的記錄可以不包括“視頻長度”字段,因為記錄并不包括“Video”字段(即“VideoLength”的父親)。使得能夠觀看并編輯記錄的應用程序可以在視覺上嵌套來自于父節(jié)點的從屬孩子(即,將孩子縮排(indent)在父字段的右側)。對數(shù)百萬的記錄進行分析可能是耗時的。在一些示例中,用戶對來自單個字段的數(shù)據(jù)感興趣,但是每個記錄都必須以其整體進行訪問。例如,用戶可以請求分析程序對數(shù)百萬記錄中的每一個進行檢查以識別與包括不長于十分鐘并且具有“高”分辨率的視頻的網(wǎng)頁相關聯(lián)的記錄。由于每個記錄可以被存儲為單獨的數(shù)據(jù)結構,所以每個完整記錄可能需要被加載到數(shù)據(jù)庫管理系統(tǒng)中以便查詢該記錄以確定記錄是否包括視頻長度和分辨率的特定組合。這樣加載每個單獨記錄在執(zhí)行任務所需的服務器數(shù)量以及完成查詢所必需的時間量方面都可能是過于昂貴的。通過將跨數(shù)百萬記錄所選擇的特定記錄的所有值一起存儲在存儲器的連續(xù)部分中能夠明顯節(jié)約時間。來自若干記錄但是針對特定字段的值的這種存儲被稱作列狀存儲(columnarstorage)。與之相比,特定記錄的信息被連續(xù)存儲在存儲器中的示例被稱作面向記錄的存儲。然而,針對嵌套記錄的列狀存儲顯現(xiàn)出特別的困難。記錄中的字段可以通過其路徑進行標識,該路徑可以包括字段和父字段的列舉(例如,GrandParent.Parent.Child)。由于路徑中的一個或多個字段可以重復,所以可能存在具有相同路徑名稱的若干字段實例。因此,當查看特定字段的列狀數(shù)據(jù)的連續(xù)列舉時,需要機制來標識出哪些值屬于哪些記錄,以及對于包括特定路徑的多個值的那些記錄而言值在記錄中的相應位置是什么。換而言之,給定列狀結構的值序列,需要機制來從值中重構記錄的結構。用于對來自列狀數(shù)據(jù)的記錄的結構進行重構的機制包括對于列狀數(shù)據(jù)中的每個值存儲“重復”級別和“定義”級別。每個“級別”可以是表示數(shù)字的比特序列。例如,“級別”3可以由兩個比特(例如,“11”)來表示。在另一個示例中,“級別”5可以由三個比特(例如“101”)來表示。針對特定值所存儲的“重復”級別指示值路徑中最近重復過的字段。作為說明,可以針對具有路徑“Video.Resolution.Width”的字段存儲一列值。重復級別“I”可以指示“Video”字段最近被重復過,而重復級別“2”可以指示“Resolution”字段最近被重復過。最近重復可以指示從記錄中的值的如下位置起,路徑“Video.Resolution.Width”中的哪個字段首先達到兩次計數(shù)(例如,哪個字段首先被遇到兩次),從該位置選擇該值并且向上朝著文檔的開始而工作。例如,從“Width”值的位置向上工作,每個字段被遇到一次。找出每個字段的第二實例需要行進至下一個相鄰嵌套字段的深度(以及可能行進至另外的嵌套)。因此,可能遇到并不包括任何“Resolution”孩子的“Video”字段(例如,因為“Resolution”字段是可選字段或重復字段)。因此,“Video”字段已經(jīng)被遇到兩次并且因此是最近重復的字段。重復級別“I”被指定給該值。重復級別“O”可以指示該字段并不包括最近重復的值(例如,其在上下掃描期間已經(jīng)在記錄中被第一次遇到)。在各種示例中,路徑中的“要求”字段并不具有重復級別。例如,如果“Resolution”字段對于“Video.Resolution.Width”路徑而言是必需的,則分辨率級別的范圍可以為“O”或“I”。由于其在“Video”字段出現(xiàn)時一直出現(xiàn)在記錄中,所以“Resolution”可以不具有級別。因此,如果“Resolution”被指定為級別“2”,則其一直在“Video”之前被遇到,并且因此可以永遠不被指定以級別“I”。因此,不包括所要求字段的重復級別可以使得能夠減少不同分辨率級別的數(shù)量,并且可以減少表示分辨率級別的比特數(shù)量。如果以上示例中的字段“Width”是“可選”或“重復”字段,則記錄可能不會一直包括“Width”字段的值。因此,“Video.Resolution.Width”路徑的值列可以使用一種機制來指定何時在記錄中找到“Video”或“Video.Resolution”路徑,而“Width”字段還沒有在該記錄中被實例化。該機制可以包括在數(shù)據(jù)的“Video.Resolution.Width”列中存儲記錄中的每個“Video”或“Video.Resolution”字段的“定義”級別而無論“Width”字段是否被實例化?!岸x”級別可以指示有多少在“Video.Resolution.Width”路徑中可能(例如,由于字段為可選或可重復的)缺失的字段實際存在。因此,如果字段“Video”出現(xiàn)在記錄中但是沒有實例化相對應的“Resolution”孩子,則可以在“Video.Resolution.Width”列中記錄定義級別“I”。如果字段“Video.Resolution”出現(xiàn)在記錄中,但是沒有實例化相對應的“Width”孩子,則可以記錄定義級別“2”。如果字段“Video.Resolution.Width"出現(xiàn)在記錄中,則可以記錄定義級別“3”。這樣,可以對記錄中的每個數(shù)據(jù)元素路徑或數(shù)據(jù)元素路徑的一部分生成定義級別。例如,路徑“Video.Resolution.Width”可以具有定義級別“3”,其標識出路徑“Video.Resolution.Width”中所包括的數(shù)據(jù)元素的數(shù)量。作為另一個示例,路徑“Video.Resolution”可以具有定義級別“2”,其標識出路徑“Video.Resolution”中所包括的數(shù)據(jù)元素的數(shù)量,即使“Width”數(shù)據(jù)元素沒有在數(shù)據(jù)記錄中被實例化。因此,無論“定義”級別(其表示可能未定義但是實際上已經(jīng)定義的字段的數(shù)目)何時小于所能夠定義的字段的數(shù)目,都可以標識出“Width”字段沒有出現(xiàn)。在各種示例中,“定義”級別是布爾值而不是整數(shù)??梢栽诹私饽膫€所包含對象未定義并不重要的情況下使用布爾值而不是整數(shù)。例如,“Video.Resolution.Width”路徑的Width字段的值的定義級別可以為“空”,其中系統(tǒng)無需了解哪個父字段被實例化?!爸貜汀奔墑e和“定義”級別的組合可以使得記錄的結構能夠被重新構建。特定字段(例如,“Video.Resolution.Width”字段)的數(shù)據(jù)列可以包括來自多個記錄的該字段的值、相對應的重復和定義級別(承認一些“缺失”值可能具有重復和定義級別)和報頭信息。在一些示例中,值被連續(xù)且相鄰存儲。換句話說,如果一個“Video.Resolution.Width”字段的值為“700”并且下一個“Video.Resolution.Width”字段的值為800,則如存儲器中所存儲的該列的一部分可以讀出“700800”。在該示例中,列中的報頭可以標識出每個值具有固定寬度(例如,用來保存數(shù)字700和800的固定二進制表示)。在一些示例中,所存儲值可以由串進行表示。例如,“Width”字段的實例可以包括值“Small”和“Medium”。在一些示例中,各種串的值可以為固定長度(例如,可以將空值添加至“Small”值的開頭或結尾以使得串與“Medium”值的長度相同)。然而,在一些示例中,每個所存儲的串在串的開頭部分可以包括標識出串的長度的標識符。例如,“small”值可以包括指示該串為五個數(shù)位長度(或者相對應的二進制比特數(shù)目)的標識符。由于值可以在列狀條帶中連續(xù)存儲,所以“重復”和“定義”級別可以被存儲在列狀條帶的開頭。在一些示例中,“重復”和“定義”級別針對特定值(無論是被實例化還是缺失)而成對存儲。作為說明,可以在字節(jié)的前四個比特中存儲重復級別3,并且可以在字節(jié)的后四個比特中存儲定義級別I。報頭中的下一個字節(jié)可以包括記錄中的下一個字段實例(或者后續(xù)記錄中的第一個實例)的重復級別和定義級別。用來表示重復和定義級別的比特的數(shù)量可以基于最大級別的值。例如,如果最大重復級別為3,則重復級別可以利用兩個比特來表示。如果最大重復級別為4,則重復級別可以利用三個比特來表示。報頭可以包括標識出重復和定義級別的長度的信息。在各種示例中,重復級別可以在存儲器中連續(xù)存儲,并且定義級別可以在存儲器中連續(xù)存儲(例如,并不成對)。在各種示例中,重復和定義級別可以與其相對應的值(如果值被實例化)一起存儲在組中。換句話說,列狀條帶中的信息序列可以讀出為Valuel:RepetitionLevellDefinitionLeveilValue2RepetitionLevel2:DefinitionLevel2,坐坐寸寸ο列狀條帶可以被壓縮為信息塊。例如,每個列狀條帶可以被劃分為一組塊,其中每個塊包括其自己各自的報頭。第一塊可以包括來自160萬個值的條帶中的前800000個值而第二塊可以包括后800000個值。塊的報頭可以包括重復和定義級別以及可以用來幫助對該塊所表示的列狀條帶部分進行分析并重構該列狀條帶的附加信息。在一些示例中,塊報頭包括“Assertion”值,其定義在塊的值中所找到的數(shù)據(jù)的類型。例如,“Video.Resolution.Width”字段的塊可以不包括任何列出“Large”寬度分辨率的值。因此,“Assertion”值可以指示該值僅包括“Small”和“Medium”值。如果對包括“High”寬度分辨率視頻的記錄執(zhí)行查詢,則所描述的塊可以被查詢系統(tǒng)所避免。本文檔中所描述的系統(tǒng)可以對列狀條帶執(zhí)行查詢而并不將列狀條帶中的信息重構為記錄,并且并不將來自列狀條帶的信息加載到數(shù)據(jù)庫中(例如,并不使用“插入”子句)。因此,可以就地訪問數(shù)據(jù),這可以以量級次序提供計算分析時間的節(jié)約。查詢系統(tǒng)可以采用被用于對關系數(shù)據(jù)庫進行查詢的許多子句。然而,可以采用特定于非關系數(shù)據(jù)的另外的子句。例如,WITHIN子句可以允許對單個記錄或者記錄的一部分之內(nèi)的字段的多個實例執(zhí)行運算。然而,關系數(shù)據(jù)庫可能無法在一行中存儲多于一個的單個字段實例(例如,記錄的表示)。因此,對于關系數(shù)據(jù)庫的查詢基本上無法執(zhí)行記錄“內(nèi)”的查詢。作為WITHIN子句的示例,特定字段的值可以相乘。假設查詢指令請求針對特定記錄將“MutualFund.1nterestRate”的所有值相乘在一起(其中每個記錄可以針對特定的賬戶持有者)。查詢系統(tǒng)可以找到單個記錄內(nèi)的所有“MutualFund.1nterestRate”值并且將它們一起相乘??梢蕴囟ㄓ诜顷P系嵌套數(shù)據(jù)的另一個子句示例是OMITIF子句。該子句可以使得在滿足特定條件的情況下對記錄進行過濾以去除字段實例(例如,可以創(chuàng)建去除了指定字段的新的列狀條帶或記錄)。作為說明,可以對列出雇員薪水的值條帶進行查詢,并且可以使用OMITIF子句生成去除了薪水高于$90000的雇員的新條帶。1.介紹可以使用商品及其的共享集群來執(zhí)行大規(guī)模的并行計算。參見L.A.BaiToso和U.Holzle.TheDatacenterasaComputerAnIntroductiontotheDesignofWarehouse-ScaleMachines.Morgan&ClaypoolPublishers,2009。集群可以托管共享資源的大量分布式應用,具有大幅變化的工作負載,并且在具有不同硬件參數(shù)的機器上運行。分布式應用中的個體計算機器可能花費遠比其它機器更長的多的時間來執(zhí)行給定任務,或者可能由于故障或者集群管理系統(tǒng)所進行的搶占而永遠不會完成。因此,對掉隊者(例如,具有明顯延遲的計算任務)和故障進行處理可能實現(xiàn)快速執(zhí)行和故障容錯。參見G.Cazjkowsh1.SortingIPBwithMapReduce.OfficialGoogleBlog,Nov.2008.位于http://googleblog.blogspot.com/2008/11/sorting-lpb-with-mapreduce.html。網(wǎng)絡和科學計算中所使用的數(shù)據(jù)經(jīng)常是非關聯(lián)的。因此,靈活的數(shù)據(jù)模型在這些領域中可能是有益的。編程語言、分布式系統(tǒng)所交換的消息、網(wǎng)絡業(yè)務日志等中所使用的數(shù)據(jù)結果可能使得其自身呈現(xiàn)嵌套表示。例如,數(shù)據(jù)的嵌套表示可以包括均包括若干子字段級別的多個字段。一些子字段可以包括相對應的數(shù)據(jù)。對這樣的處于網(wǎng)絡規(guī)模的數(shù)據(jù)進行歸一化和重新組合在計算上會是昂貴的。嵌套數(shù)據(jù)模型在主要網(wǎng)絡公司成為了一些結構化數(shù)據(jù)處理的基礎。本文檔描述了一種在商業(yè)機器的共享集群上支持對非常大的數(shù)據(jù)集進行交互式分析的系統(tǒng)。不同于傳統(tǒng)的數(shù)據(jù)庫,其能夠就地對嵌套數(shù)據(jù)進行操作。就地是指“原地”訪問數(shù)據(jù)的能力,例如在如GoogleFileSystem的分布式文件系統(tǒng)中(參見S.Ghemawat,H.Gobioff和S.-T.Leung.TheGoogleFileSystem.1nS0SP,2003),或者如Bigtable的另一存儲層面(參見F.Chang,J.Dean,S.Ghemawat,ff.C.Hsieh,D.A.ffallach,M.Burrows,T.Chandra.A.Fikes和R.Gruber.Bigtable:ADistributedStorageSystemforStructuredData.1nOSDI,2006)該系統(tǒng)能夠對這樣的數(shù)據(jù)執(zhí)行許多查詢,其可以常規(guī)地要求MapReduce工作的順序,但是僅用部分執(zhí)行時間。參見J.Dean和S.Ghemawat.MapReduce!SimplifiedDataProcessingonLargeClusters.1n0SDI,2004。所描述的系統(tǒng)可以結合MapReduce使用以對MapReduce管線的輸出進行分析或者快速建立較大計算的原型。使用該系統(tǒng)的示例包括網(wǎng)絡日志和所爬取的網(wǎng)絡文檔的分析;·在線市場所提供的應用的安裝數(shù)據(jù);·應用產(chǎn)品的故障數(shù)據(jù)(crashdata);·多媒體回放統(tǒng)計;·根據(jù)圖書掃描的OCR結果;·垃圾郵件分析;·地圖瓦片的調(diào)試;·所管理Bigtable實例中的板塊遷移;·在分布式構建系統(tǒng)上運行的測試的結果;·對于成百上千磁盤的磁盤I/O統(tǒng)計;·跨若干數(shù)據(jù)中心的MapReduce工作的執(zhí)行日志;以及·代碼庫中的符號和依賴關系。所描述的系統(tǒng)建立在來自網(wǎng)絡搜索和并行數(shù)據(jù)庫管理系統(tǒng)的思想之上。首先,其架構建立在分布式搜索引擎中所使用的服務樹(servingtree)的概念之上。參見J.Dean.ChallengesinBuildingLarge-ScaleInformationRetrievalSystemsInvitedTalk.1nWSDM,2009。如同網(wǎng)絡搜索請求那樣,查詢對樹進行下推并且在每個步驟進行重寫。通過聚合從樹的較低級別所接收的回復而對查詢的結果進行整合。第二,所描述的系統(tǒng)提供了高級的、類似SQL的語言來表達adhoc查詢。與諸如Pig(參見C.Olston,B.Reed,U.Srivastava,R.Kumar和A.Tomkins.PigLainaNot-so-ForeignLanguageforDataProcessing.1nSIGM0D,2008o)和Hive(Hive.http://wik1.apache,org/hadoop/hive,2009)之類的層相比,該查詢系統(tǒng)執(zhí)行本地查詢而并不將它們轉換為MapReduce工作。最后,所描述的系統(tǒng)使用列狀條帶的表示,這使得其能夠從次級存儲讀取較少數(shù)據(jù)并且由于較為廉價的壓縮而減少CPU成本。用于分析關系數(shù)據(jù)的列存儲(D.J.Abadi,P.A.Boncz和S.Harizopoulos.Column-OrientedDatabaseSystems.VLDB,2(2),2009)并未被相信已經(jīng)擴展至嵌套數(shù)據(jù)模型。所描述的列狀存儲格式可以被MapReduce、Sawzall(參見R.Pike,S.Dorward,R.Griesemer和S.Quinlan.1nterpretingtheDataParallelAnalysiswithSawzall.ScientificProgramming,13(4),2005)和FlumeJave(參見C.Chambers,A.Raniawla,F.Perry,S.Adams,R.Henry,R.Bradshaw和N.ffeizenbaum.FlumeJave:Easy,EfficientData-ParallelPipelines.1nPLDI,2010)所支持。在第4部分中,本文檔描述了針對嵌套數(shù)據(jù)的列狀存儲格式。給出了用于將嵌套記錄分解為列并對它們進行重新整合的算法。在第5部分中,描述了用于對以列狀存儲器格式進行存儲的數(shù)據(jù)進行處理的查詢語言。該查詢語言以及該語言的執(zhí)行被設計為對列狀條帶化的嵌套數(shù)據(jù)進行有效操作而并不要求對嵌套記錄進行重構。在第6部分中,提供了在網(wǎng)絡搜索服務系統(tǒng)中用于數(shù)據(jù)庫處理的應用執(zhí)行樹的說明。對有效應答聚合查詢的好處進行了解釋。在第7部分中,給出了在系統(tǒng)實例上進行的實驗。第2部分示例情形假設網(wǎng)絡搜索公司的工程師Alice想到了用于從網(wǎng)頁提取新的信號類型。她運行曲折通過(crankthrough)包括來自網(wǎng)頁的內(nèi)容的輸入數(shù)據(jù),并且產(chǎn)生包含新信號的數(shù)據(jù)集合的MapReduce工作,該數(shù)據(jù)集合以數(shù)百萬記錄存儲在分布式文件系統(tǒng)中。為了對她的實驗結果進行分析,她啟動本文檔所描述的系統(tǒng)并且執(zhí)行若干交互式命令DEFINETABLEtAS/path/to/data/*SELECTTOP(signal1,100),COUNT(*)FROMtAlice的命令在數(shù)秒內(nèi)執(zhí)行。她運行幾個其它查詢以使她自己相信她的算法奏效。她找出了信號I中的不規(guī)律性并且通過編寫FlumeJava程序進行更深的挖掘,該程序對她的輸出數(shù)據(jù)集合執(zhí)行更為復雜的分析計算。一旦問題被修復,她就設置對傳入的輸入數(shù)據(jù)繼續(xù)進行處理的管線。她規(guī)劃了跨各個維度對其管線的結果進行聚合的幾個預先錄制的(canned)SQL查詢,并且將它們添加到交互式控制臺(例如,與服務相關的對服務進行解釋并且對關于服務的統(tǒng)計進行細化的網(wǎng)頁)。最后,她將其新的數(shù)據(jù)集合登記在目錄中從而其它工程師能夠快速定位并查詢該數(shù)據(jù)集合。以上情形可能要求查詢處理器和其它數(shù)據(jù)管理工具之間的交互操作。這樣的交互操作的第一要素是共用的存儲層。GoogleFileSystem是一個可以使用的這樣的分布式存儲層。GoogleFileSystem對跨數(shù)千臺機器以及數(shù)萬個磁盤的非常大的復制數(shù)據(jù)集進行管理。復制盡管在故障硬件的情況下也有助于保存數(shù)據(jù),并且在存在落后者的情況下獲得快速的響應時間。高性能的共享存儲層是就地數(shù)據(jù)管理的關鍵性使能因素。其允許對數(shù)據(jù)進行訪問而沒有耗時的加載階段,而加載階段對于分析數(shù)據(jù)處理中的數(shù)據(jù)庫使用而言是主要的阻力(其中在數(shù)據(jù)庫管理系統(tǒng)能夠加載數(shù)據(jù)并執(zhí)行單次查詢之前經(jīng)常可能運行數(shù)十次MapReduce分析)。例如,當數(shù)據(jù)庫管理系統(tǒng)被用來分析數(shù)據(jù)時,數(shù)據(jù)庫可能需要使用“插入”命令而被加載以數(shù)據(jù)。而所描述的系統(tǒng)可以不需要這樣的加載。作為所增加的好處,可以使用標準工具對文件系統(tǒng)中的數(shù)據(jù)進行方便地操縱,例如傳輸至另一個集群,改變訪問特權,或者基于文件名標識數(shù)據(jù)子集以用于分析。用于構建可交互操作的數(shù)據(jù)管理組件的第二要素是共享的存儲格式。列狀存儲被用于扁平(flat)關系數(shù)據(jù),但是將列狀存儲適用于嵌套數(shù)據(jù)模型進行適配的關系數(shù)據(jù),允許該技術被應用于網(wǎng)絡數(shù)據(jù)。圖1圖示了數(shù)據(jù)結構中嵌套字段的所有值被連續(xù)存儲的思想。例如,在嵌套數(shù)據(jù)的面向列的表示中,數(shù)據(jù)結構內(nèi)特定嵌套字段(例如,字段A.B.C)的所有值彼此相鄰存儲,并且在存儲器中連續(xù)存儲。因此,可以從存儲獲取字段A.B.C的值,而并不讀取來自字段A.E的值以及來自字段A.B.D的值。此外,數(shù)據(jù)結構的不同實例(例如,“記錄”)中相同的特定字段的值可以連續(xù)存儲。例如,記錄“rl”的字段A.B.C的值與記錄“r2”的相同字段的值相鄰存儲。與之相反,在嵌套數(shù)據(jù)的“面向記錄”的表示中,特定記錄內(nèi)所有字段的值被連續(xù)存儲。換句話說,特定字段的數(shù)據(jù)值并不被串在一起。所描述的列狀存儲格式所面臨的挑戰(zhàn)在于如何保存所有結構信息并且能夠從任意的字段子集來重構記錄。本文檔接下來討論可以從其填寫列狀存儲格式的字段的數(shù)據(jù)模型,并且隨后轉向用于對列狀存儲進行處理的算法以及對列狀存儲中的數(shù)據(jù)的查詢處理。第3部分數(shù)據(jù)模型該部分對所描述系統(tǒng)所使用的數(shù)據(jù)模型進行描述并且介紹隨后使用的一些術語。所描述的協(xié)議緩沖器數(shù)據(jù)模型在分布式系統(tǒng)的上下文中進行組織并且可用作開源實現(xiàn)。參見(ProtocolBuffersDeveloperGuide??稍趆ttp://code,google,com/apis/protocolbuffers/does/overview,html獲得)。該數(shù)據(jù)模型基于強類型的嵌套記錄。其抽象語法由τ=dom|<Al:τ[*|],···,An:τ[*|]>所給出,其中τ是原子類型或記錄類型。dom中的原子類型包括整數(shù)、浮點數(shù)、串等。記錄由一個或多個字段所構成。記錄中的字段i具有名稱化以及可選的多重性標簽。重復字段(*)可以在記錄中多次出現(xiàn)。它們被解釋為值列表,即字段在記錄中出現(xiàn)的順序是有意義的??蛇x字段(?)可以從記錄中缺失。否則,字段是必需的(例如,必須確切地出現(xiàn)一次)。作為圖示,圖2描繪了定義記錄類型“Document”的模式,其表示網(wǎng)絡文檔。該模式定義使用協(xié)議緩沖器語法?!癉ocument”具有必需的整數(shù)“Docld”和可選的“Links”,其包含保存其它網(wǎng)頁的“Docld”的“Forward”和“Backward”條目的列表?!癉ocument”可以具有多個“Name”,其可以是可以通過其引用文檔的不同URL?!癗ame”包含“Code”和(可選的)“Country”配對的序列。圖2還示出了符合該模式的兩個樣本記錄rl和r2。記錄結構使用縮進進行概括。圖2中的樣本記錄rl和r2被用來解釋本文通篇的算法。該模式中所定義的字段形成了樹形層級。嵌套字段的完整路徑使用帶點注釋形式來進行注釋,例如,Name.Language.Code是圖2中所描繪的“Code”字段的完整路徑名稱。嵌套數(shù)據(jù)模型支持一種用于對結構化數(shù)據(jù)進行串行化的平臺中立的可擴展機制。代碼生成工具對諸如C++或Java的不同編程語言產(chǎn)生綁定。跨語言的可交互操作能力使用記錄的標準二進制線上(on-the-wire)表示來獲得,其中字段值在它們出現(xiàn)在記錄中時被順序布局。以這種方式,以Java編寫的MapReduce程序能夠使用來自經(jīng)由C++庫所展現(xiàn)的數(shù)據(jù)源的記錄。因此,如果記錄以列狀表示進行存儲,則將它們快速整合可以有助于與MapReduce和其它數(shù)據(jù)處理工具的交互操作。第4部分嵌套列狀存儲如圖1所示,目標是連續(xù)存儲給定字段的所有值以提高檢索效率。在該部分中,解決了列狀格式的記錄結構的無損表示(第4.1部分),快速編碼(第4.2部分)以及有效記錄整合(第4.3部分)的挑戰(zhàn)。第4.1部分重復和定義級別值值的連續(xù)列表并不單獨傳遞記錄的結構。給定在記錄中重復的字段的兩個值,系統(tǒng)可能無法確定該值在哪個“級別”重復(例如,兩個值是來自不同記錄還是來自相同記錄)。同樣,如果任選字段從記錄中缺失,則值不能單獨表達哪些封閉記錄被明確定義而哪些則不是。因此引入了重復和定義級別的概念。圖3包括對圖1中所描繪的樣本記錄中的原子字段的重復和定義級別進行概括的表。重復級別??紤]圖2中的字段“Code”,其在記錄“rl”中出現(xiàn)了三次。“en-us”和“en”在第一個“Name”字段內(nèi),而“en_gb”則處于第三個“Name”字段中。為了將這些出現(xiàn)在列狀結構中進行區(qū)分,將重復級別附加至要以列狀結構進行存儲的每個值。重復級別指示值在字段路徑中的哪個重復字段處重復。例如,字段路徑Name.Language.Code包含兩個重復的字段“Name”和“Language”。因此,Code的重復級別范圍處于O和2之間。級別O表示新記錄的開始,級別I表示在“Name”字段最近的重復,而級別2則表示在“Language”字段最近的重復。作為為字段確定級別的說明,可以對記錄“rl”從上至下進行掃描。值“en-us”被首先遇到并且可以執(zhí)行檢查以標識Name.Language.Code路徑中在記錄中最近重復的字段。在該示例中,還沒有字段重復,并且因此重復級別為O。對于Name.Language.Code路徑而言,接下來遇到值“en”,并且字段“Language”被識別為最近重復過的字段。例如,從值“en”向上掃描,Name.Language.Code路徑中第一個重復的字段是“Language”。因此,重復級別為2(例如,因為“2”對應于“Language”字段,原因在于“Language”是Name.Language.Code路徑中重復的第二個字段)。最后,在遇到值“en-gb”時,字段“Name”最近重復過(“Language”字段在Name之后僅出現(xiàn)一次),從而重復級別為I。換句話說,值的重復級別可以是表示最近重復的字段的數(shù)字。因此,記錄“rl”中Code值的重復級別為0,2,I。注意,記錄“rl”中的第二個“Name”字段并不包含字段“Code”的任何值。為了確定“en-gb”作為字段“Name”的第三實例內(nèi)嵌套的字段的值出現(xiàn)而并不處于第二實例中,當值“en”和“en-gb”以列狀結構進行存儲時在它們之間加入NULL值(見圖3)。“Code”是“Language”字段的必需子字段,從而“Code”字段的值缺失的事實暗示了“Language”字段也沒有定義??傮w而言,確定嵌套記錄的存在所達到的級別可以要求附加信息。定義級別。字段中具有路徑“P”的每個值,特別是每個NULL值,具有“定義級別”,其指定了有多少路徑“P”中可能未定義的字段(例如,由于該字段是可選的或重復的)實際出現(xiàn)在在記錄中。為了說明,觀察記錄“rl”沒有針對“Links”字段的“Backward”字段。而且,字段“Links”被定義(在級別I)。為了保存該信息,具有定義級別I的NULL值被添加至“Links.Backward”列。換句話說,為“Links.Backward”路徑指定級別I指示作為可選或重復的“I”字段(即,“Links”字段)被定義在包括兩個字段的路徑中,這兩個字段是可選或重復的(即,“Links”字段和“Backward”字段)。因此,定義“I”指示“Backward”字段沒有被實例化。類似地,記錄“r2”中缺失出現(xiàn)的“Name.Language.Country”攜帶定義級別I,而其在記錄“rl”中缺失的出現(xiàn)則分別具有定義級別2(在“Name.Language”內(nèi))和I(在“Name”內(nèi))。對以上進行概括的編碼過程可以無損地保存記錄結構。麵。如存儲器中所存儲的那樣,對應于特定字段的每個列可以與報頭一起存儲,該報頭包括重復和定義值的連續(xù)列表,隨后為實質性值的連續(xù)列表。每個重復和定義值可以作為比特序列進行存儲(例如,在單個字節(jié)中)。例如,一個字節(jié)的前四個比特可以被用來表示特定值的重復級別,而后四個比特可以被用來表示定義級別。在一些示例中,報頭可以包括多個比特的長度的定義,從而可以不使用定界符。因此,可以僅使用必要的比特。例如,如果最大定義級別為3,則可以使用每個定義級別兩個比特。因此,單個字段(例如,“Name.Language.Code”字段)的列狀數(shù)據(jù)的表示可以與字節(jié)序列一起存儲在存儲器中,該字節(jié)序列表示相對應值序列的重復和定義級別,隨后為值序列。然而,NULL值可以不被明確存儲,因為它們可以通過分析定義級別來確定。例如,小于字段路徑中的重復和可選字段數(shù)量的任何定義級別都可以表示NULL。因此,系統(tǒng)可以能夠確定應當在連續(xù)值的列表中的何處插入或推斷NULL值。在一些示例中,并不針對一直被定義的值存儲定義級別。類似地,重復級別可以僅在要求的情況下才存儲。例如,定義級別O暗示了重復級別0,從而后者可以被省略。實際上,參考圖3中所圖示的結構,可以不對“Docld”字段存儲級別。列狀數(shù)據(jù)在存儲器中的表示可以被分解為塊集合。每個塊可以包括包頭以及隨后的字段值的列表,該報頭包括重復和定義級別信息。每個報頭可以包括“約束”值,其指示塊中可允許的值范圍。因此,所描述的系統(tǒng)可以標識出哪些塊包括系統(tǒng)感興趣的數(shù)據(jù)。約束還可以指示值的其它屬性,例如,該值是否已經(jīng)被存儲。通常,“約束”可以被認為是關于在塊中找到什么類型的值的“聲明”。每個塊可以被壓縮。第4.2部分將記錄劃分為列以上描述給出了以列狀格式的記錄結構編碼。挑戰(zhàn)是如何有效產(chǎn)生具有重復和定義級別的列狀條帶。以下提供計算重復和定義級別的基本算法。該算法遞歸到記錄結構中并且為每個字段值計算級別。如之前所說明的,即使在字段值缺失的情況下也需要計算重復和定義級別。許多數(shù)據(jù)集合是稀疏的,并且擁有具有數(shù)千字段的模式但是僅有其中百來個在給定記錄中被使用可能并非是不同尋常的。為了產(chǎn)生列狀條帶,創(chuàng)建字段寫入器(writer)的樹,其結構域模式中的字段層級相匹配。基本思想是在字段寫入器具有自己的數(shù)據(jù)時更新它們,并且除非絕對必要否則并不嘗試將父狀態(tài)向樹下傳播。為此,子寫入器從其父繼承級別。子寫入器在添加新值的任何時候與其父級別進行同步。圖4示出了一種用于將記錄分解為列的示例算法。過程“DissectRecord”傳遞了“RecordDecoder”的一個實例,其被用來遍歷二進制編碼的記錄?!癋ieldWriters”形成于輸入模式同構的樹形層級。根“FieldWriter”針對新記錄而被送至該算法,其中“repetitionLevel”被設置為O?!癉issectRecord”過程的主要工作是保持當前的“repetitionLevel”。通過當前寫入器的樹位置將當前的“definitionLevel”唯一確定為字段路徑中的任選和重復字段的數(shù)目之和。該算法的while循環(huán)(第5行)在給定記錄中所包含的所有院子和記錄賦值字段上進行迭代。集合“seenFields”對字段是否已經(jīng)在記錄中被看到進行追蹤。子重復級別“chR印etitionLevel”被設置為最近重復字段的重復級別,否則缺省為其父級別(第9-13行)。該過程在嵌套記錄上被遞歸調(diào)用(第18行)。文檔以上所引用的“FieldWriters”對界別進行累加并且將它們惰性地(lazily)傳播至較低級別的寫入器。這可以由保持(重復,定義)級別序列的每個非葉寫入器所執(zhí)行。每個寫入器還具有與之相關聯(lián)的“版本”編號。簡單指出,寫入器版本在級別增加的任何時候以一遞增。孩子記住它們與之同步的最后父版本就足夠了。如果子寫入器曾得到其自己的(非空)值,則其通過取得新的級別而將其狀態(tài)與父進行同步,并且僅在隨后添加新的數(shù)據(jù)。由于輸入數(shù)據(jù)可以具有數(shù)千字段和數(shù)百萬的記錄,所以將所有級別存儲在存儲器中可能是不可行的。一些級別可以臨時存儲在磁盤上的文件中。為了對空的(子)記錄進行無損編碼,非原子字段(諸如圖2中的Name.Language)可能需要具有其自己的列狀條帶,其僅包含級別但是沒有非空值。第4.3部分記錄整合從列狀數(shù)據(jù)有效整合記錄(例如,記錄“rl”和“r2”)對于面向記錄的數(shù)據(jù)處理工具(例如,MapReduce)是關鍵的。給定字段的子集,目標是對原始記錄進行重構就像它們僅包含所選擇字段,而所有其它字段都被剝離。關鍵思想是要創(chuàng)建有限狀態(tài)機(FSM),其讀取字段值以及每個字段的級別,并且將值順序附加至輸出記錄。FSM狀態(tài)對應于每個所選擇字段的字段讀取器。狀態(tài)變換利用重復級別進行標記。一旦讀取器取得值,則查看下一個重復級別以決定要使用什么樣的下一個讀取器。針對每個記錄對FSM從開始到結尾狀態(tài)遍歷一次。圖5示出了對我們所運行的示例中使用第4.1部分中所描述的塊作為輸入來重構完整記錄的FSM。在該示例中,節(jié)點利用字段進行標記并且邊緣利用重復級別進行標記。開始狀態(tài)為“Docld”。一旦“Docld”值被讀取,F(xiàn)SM就變換至“Links.Backward”狀態(tài)。在所有重復的“Backward”值都已經(jīng)被用盡之后,F(xiàn)SM跳轉至“Links.Forward”,等等。為了概述如何構建FSM變換,令“I”為當前字段讀取器針對字段“f”所返回的下一個重復級別。在模式樹(例如,圖2中的模式)中的“f”開始,其祖先被發(fā)現(xiàn)在級別“I”重復并且選擇該祖先內(nèi)的第一個葉字段“η”。這提供了FMS變換(一η。例如,令“1”=1為‘f’=‘Name.Language.Country’所讀取的下一個重復級別。其具有重復級別“I”的祖先為Name,其第一個葉字段為‘n’=‘Name.Url’。如果僅需要對字段的子集進行獲取,則可以構建執(zhí)行較為廉價的較簡單的FSM。圖6描繪了用于讀取字段“Docld”和“Name.Language.Country”的FSM。該圖示出了自動機所產(chǎn)生的輸出記錄“Si”和“s2”。注意,編碼和整合算法保留了字段“Country”的封閉結構。這對于需要訪問例如第二個Name的第一個Language中出現(xiàn)的Country的應用來說是重要的。在XPath中,這可以對應于對類似/Name[2]/Language[I]/Country的表達式進行評估的能力。構造FSM的過稈。圖7示出了用于構造執(zhí)行記錄整合的有限狀態(tài)機的算法。該算法取應當填充于記錄中的字段作為輸入,其順序為它們在模式中出現(xiàn)的順序。該算法使用兩個字段的“共同重復級別”的概念,這是它們的最低共同祖先的重復級別。例如,“Links.Backward”和“Links.Forward”的共同重復級別等于I。第二個概念是“屏障”的概念,這是序列中當前字段之后的下一個字段。直觀(intuition)的是在于每個字段試圖被逐個處理直至達到屏障并且需要跳轉至之前看到的字段。該算法由三個步驟所構成。在步驟1(第6-10行),向后處理共同重復級別。這些被保證是非增加的。對于所遇到的每個重復級別,取出序列最左側的字段一這是在“FieldReader”返回該重復級別時要變化至的字段。在步驟2,填充間隙(第11-14行)。該間隙是因為并非所有的重復級別都出現(xiàn)在第8行中所計算的共同重復級別中而出現(xiàn)的。在步驟3(第15-17行),針對所有級別的變換都被設置為等于或低于屏障級別以跳轉至屏障字段。如果“FieldReader”產(chǎn)生了這樣的級別,則可以繼續(xù)構建嵌套記錄并且可能無需跳離屏障。整合記錄過稈。(圖8所示的)整合記錄過程取“FieldReader”以及(隱含地)具有讀取器之間的狀態(tài)變換的FSM的集合作為輸入。換句話說,該算法在FSM和列狀數(shù)據(jù)上進行操作并且輸出所構建的記錄。變量讀取器在主例程中保持當前“FieldReader”(第4行)。變量讀取器保持其值被附加至記錄并且可用于圖7所示的所有三個過程的最后讀取器。主要的while循環(huán)處于第5行。從當前讀取器取得下一個值。如果該值通過查看其定義級別而確定不為NULL,則被整合的記錄在方法“MoveToLevel”中與當前讀取器的記錄結構同步,并且字段值被附加至該記錄。否則,可以對記錄結構進行調(diào)節(jié)而并不附加任何值一這可以在出現(xiàn)空記錄時進行。在第12行,使用“完整定義級別”?;叵攵x級別因子來考慮所必需的字段(只算重復和可選字段)。完整定義級別將所有字段都納入考慮。過程“MoveToLevel”將記錄從“IastReader”的狀態(tài)變換為“nextReader”的狀態(tài)(參見第22行)。例如,假設“IastReader”對應于圖2中的“Links.Backward”而“nextReader”是“Name.Language.Code”。以該順序,該方法終止嵌套記錄Links并且開始新的記錄Name和Language。過程“ReturnsToLevel”(第30行)是“MoveToLevel”的對應方,其僅終止當前記錄而并不開始任何新的記錄。在其線上表示中,記錄被布局為后跟字段值的字段標識符的配對。與XML相類似(實際的二進制編碼可以有所不同),嵌套記錄可以被認為具有“開放標簽”和“閉合標簽”?!伴_始”記錄的描述是指寫入開放標簽,而“終止”記錄則是指寫入閉合標簽。第5部分查詢語言所描述的系統(tǒng)可以采用基于SQL并且被設計為可在列狀嵌套存儲上有效實施的查詢語言。這里對該查詢語言的各個方面進行描述。每個類似SQL的語句(以及其所轉換為的代數(shù)算子)取一個或多個嵌套表及其模式(例如,如第4.1部分中所描述的,表示表的列狀數(shù)據(jù)的壓縮塊的集合)作為輸入,并且產(chǎn)生嵌套表(例如,列狀數(shù)據(jù)的修改實例)及其輸出模式。圖9描繪了執(zhí)行投影、選擇和記錄內(nèi)聚合的樣本查詢。該查詢在來自圖2的表t={rl,r2}上進行評估。字段使用路徑表達式來進行引用。雖然該查詢中不存在記錄構建器(constructor),但是該查詢產(chǎn)生嵌套結果。為了解釋該查詢的行為,考慮選擇操作(WHERE子句)。將嵌套記錄認為是帶標簽的樹,其中每個標簽對應于字段名稱。選擇算子剪除該樹中并不滿足指定條件的分支。因此,僅保留了其中定義了“Name.Url”并且以“http”開始的那些嵌套記錄。接下來,考慮投影。SELECT子句中的每個標量表達式以與該表達式中所使用的重復最多的輸入字段相同的嵌套級別而發(fā)出(emit)值。從而,串連接表達式以輸入模式中的“Name.Language.Code”的級別發(fā)出“Str”值。COUNT表達式說明了記錄內(nèi)聚合。該聚合在每個“Name”子記錄之內(nèi)進行,并且對于每個“Name”發(fā)出作為非負64位整數(shù)(uint64)白勺“Name.Language.Code”出現(xiàn)數(shù)目。因此,WITHIN聲明使得能夠進行行內(nèi)聚合。換句話說,相同名稱的記錄可以被聚合在相同記錄中或者相同孩子下。與之相比,可能無法對嵌套數(shù)據(jù)進行操作的SQL就無法對行內(nèi)記錄進行操作。該語言支持嵌套的子查詢、記錄間和記錄內(nèi)聚合、top-k、聯(lián)合、用戶定義函數(shù)等。這些特征匯總的一些在實驗部分進行討論。作為一個附加示例,所描述的查詢語言包括OMITIF聲明,其能夠過濾值的行內(nèi)群組。例如,數(shù)千個記錄中的每一個可以包括若干重復的“Cost”字段,它們均包括數(shù)字值。查詢語言的用戶可能想要在字段中的值之和超過數(shù)目“20”的情況下丟掉所有記錄。因此,用戶可以采用OMITIF聲明來生成每個記錄中加總的“Cost”等于或小于二十的記錄的列表。第6部分查詢執(zhí)行樹形架構。所描述的系統(tǒng)使用多級服務樹來執(zhí)行查詢(見圖10)。根服務器接收傳入的查詢,從表讀取元數(shù)據(jù),并且將查詢路由至服務樹中的下一個級別。葉服務器與存儲層進行通信或者訪問本地磁盤上的數(shù)據(jù)。在所描述系統(tǒng)中進行操作的許多查詢是單次掃描聚合;因此,本文檔關注于對那些進行解釋并且將它們用于下一部分中的實驗??紤]以下的簡單聚類SELECTA,COUNT(B)FROMTGROUPBYA當根服務器接收到以上查詢時,其確定包括表“T”的所有板塊并且將該查詢重寫如下,其中板塊即表的水平分區(qū)SELECTA,COUNT(B)FROMTGROUPBYA表RjUNIONALL.··Rln是發(fā)送至處于服務樹的級別I處的節(jié)點1,…,n的查詢的結果RO=SELECTA,COUNT(B)AScFROMTiGROUPBYAiiT丨是“T”中被服務器“I”以級別“I”所處理的板塊的解體分區(qū)。每個服務級別執(zhí)行類似的重寫。最終,該查詢到達葉,其對“T”中的板塊進行并行掃描。在向上的途中,中間服務器執(zhí)行部分結果的并行聚合。以上所給出的執(zhí)行模型非常適于返回小型和中等大小的結果的聚合查詢,而這是非常普遍的交互式查詢類型。杳詢分配器。所描述的系統(tǒng)是多用戶系統(tǒng),例如可以同時執(zhí)行若干查詢。查詢分配器基于查詢的優(yōu)先級對它們進行調(diào)度并且平衡負載。另一個角色是在一個服務器變得遠比其它服務器更慢地多或者板塊副本變得無法訪問時提供容錯。每個查詢中所處理的數(shù)據(jù)量經(jīng)常大于可用于執(zhí)行的處理單元的數(shù)量,該處理單元被稱作時隙。時隙對應于葉服務器上的執(zhí)行線程。例如,均使用8個線程的3000個葉服務器的系統(tǒng)具有24000個時隙。從而,能夠通過對每個時隙指定大約5個板塊來對跨度為100000個板塊的表進行處理。在查詢執(zhí)行期間,如果板塊采用不成比例的長時間來進行處理,則系統(tǒng)在另一個服務器上對該板塊重新進行調(diào)度。一些板塊可能需要被多次重新分配。葉服務器讀取列狀表示中嵌套數(shù)據(jù)的條帶。每個條帶中的塊被異步地預先取出;預讀高速緩存通常獲得95%的命中率。板塊通常進行三路賦值。當葉服務器無法訪問一個板塊副本時,其轉向另一個副本。查詢分配器尊重(honor)指定返回結果之前必須掃描的板塊最小百分比的參數(shù)。如以下所描述的,將這樣的參數(shù)設置為較低值(例如,98%而不是100%)經(jīng)常能夠使得執(zhí)行明顯加速,特別是在使用較小的復制因子時。如圖7的右手側所描繪的,每個服務器可以具有內(nèi)部執(zhí)行樹。內(nèi)部樹對應于物理查詢執(zhí)行計劃,包括標量表達式的評估。優(yōu)選地,對大多數(shù)標量函數(shù)生成具體類型的代碼?;緢?zhí)行計劃由一組迭代器所構成,它們步伐一致地對輸入列進行掃描并且發(fā)出利用正確的重復和定義級別進行注釋的聚類和標量函數(shù)的結果,這在查詢執(zhí)行期間完全繞過了記錄整合。所描述系統(tǒng)所進行諸如top-k和不同計數(shù)(count-distinct)的一些查詢使用已知的單次掃描算法返回近似結果。第7部分實驗數(shù)據(jù)該部分給出了所描述系統(tǒng)在若干數(shù)據(jù)集合上的實驗評估,并且檢驗了列狀存儲對于嵌套數(shù)據(jù)的有效性。研究中所使用的數(shù)據(jù)集合的屬性在圖11中進行了概括。以未壓縮的非復制形式,數(shù)據(jù)集合占據(jù)了大約一千兆字節(jié)的空間。除了一個被雙路復制的表之外,所有表被三路復制,并且包含從100K至800K個可變大小的板塊。該部分以檢驗單臺機器上的基本數(shù)據(jù)訪問特性作為開始,隨后示出列狀存儲如何惠及MapReduce執(zhí)行,并且最后集中于所描述系統(tǒng)的性能。在常規(guī)商業(yè)操作期間,實驗在兩個數(shù)據(jù)中心中許多其它應用之外運行的系統(tǒng)實例上進行。以下所使用的表和字段名稱被匿名處理。本地磁盤。在第一個實驗中,通過掃描包含大約300K行的表Tl的IGB片段進行掃描來檢查列狀存儲相對面向記錄的存儲性能權衡(見圖12)。數(shù)據(jù)存儲在本地磁盤上并且在壓縮列狀表示中占用大約375MB。面向記錄的格式使用更嚴重的壓縮卻在磁盤上產(chǎn)生了大約相同的大小。該實驗在具有提供70MB/S讀取帶寬的磁盤的雙核Intel機器上進行。所有的報告時間都是冷卻的;0S高速緩存在每次掃描之前都被沖刷。圖12示出了五幅圖,圖示了針對字段子集讀取并解壓縮數(shù)據(jù),以及整合并解析記錄所用的時間。圖(a)-(c)概括了列狀存儲的結果。這些示圖中的每個數(shù)據(jù)點是通過對30次運行的測量進行平均而獲得的,在其中的每個中隨機選擇給定基數(shù)的列集合。圖(a)示出了讀取和解壓縮時間。圖(b)加上了對來自列的嵌套記錄進行整合所需的時間。圖(C)示出了要用多久將記錄解析為強類型的C++數(shù)據(jù)結構。圖(d)-(e)描繪了用于訪問面向記錄的存儲上的數(shù)據(jù)的時間。圖(d)示出了讀取和解壓縮時間。大塊時間花費在解壓縮中;實際上,壓縮數(shù)據(jù)能夠以大約一半的時間從磁盤進行讀取。如圖(e)所指示的,解析在讀取和解壓縮時間上加上了另外的50%。這些成本針對所有字段,包括不需要的字段,進行支付。當讀取數(shù)個列時,列狀表示的增益可能大約為一個數(shù)量級。用于列狀嵌套數(shù)據(jù)的獲取時間可以隨字段的數(shù)量線性增長。記錄整合和解析可能是昂貴的,可能均為執(zhí)行時間的兩倍。在其它數(shù)據(jù)集合上觀察到類似的趨勢。一個自然的問題是要詢問示圖的頂端和底部在哪里相交,即按照記錄的存儲在哪里開始優(yōu)于列狀存儲。按照經(jīng)驗,交叉點會位于數(shù)十個字段但是跨數(shù)據(jù)集合而變化,并且取決于是否需要記錄整合。MapReduce和所描述系統(tǒng)。接下來說明MapReduce和所描述系統(tǒng)對于列狀相比面向記錄的數(shù)據(jù)的執(zhí)行。在這種情況下,訪問單個字段并且性能增益最為顯著。針對多個列的執(zhí)行時間可以使用圖12的結果進行推斷。在該實驗中,對表“Tl”中字段“txtField”中的項的平均數(shù)目進行計數(shù)。MapReduce執(zhí)行使用以下Sawzall程序來進行numRecstablesumofint;numWordstablesumofint;emitnumRecs<—I;emitnumWords<-CountWords(input.txtField);記錄的數(shù)目存儲在變量“numRecs”中。對于每個記錄,“numWords”增加“CountWords”函數(shù)所返回的“input.txtField”中項的數(shù)目。在該程序執(zhí)行之后,平均的項頻率可以被計算為numWords=numRecs□在SQL中,該計算被表達為Q1SELECTSUM(CountWords(textile))/COUNT(*)FROMTl圖13示出了對數(shù)規(guī)模上的兩個MapReduce工作和所描述系統(tǒng)的執(zhí)行時間。兩個MapReduce工作在3000個工作者(例如,服務器)上運行。類似地,本系統(tǒng)的3000節(jié)點實例被用來執(zhí)行查詢Qp所描述的系統(tǒng)和列上MapReduce讀取O.5TB的壓縮列狀數(shù)據(jù),相比之下,記錄上的MapReduce則讀取了87TB。如圖12所圖示的,MapReduce通過從面向記錄切換至列狀存儲而在效率上有量級的增益(從數(shù)小時到數(shù)分鐘)。通過使用所描述系統(tǒng)則實現(xiàn)了另一個量級(從數(shù)分鐘到數(shù)秒)。服務樹拓撲。在下一個實驗中,圖示了服務樹深度對于查詢執(zhí)行時間的影響。在表T2上執(zhí)行兩個GROUPBY查詢,每個都使用數(shù)據(jù)上的單次掃描來執(zhí)行。表T2包含240億的嵌套記錄。每個記錄具有包含數(shù)字量的重復字段item。字段item,amount在數(shù)據(jù)集合中重復大約400億次。第一查詢通過country對項數(shù)量進行加總Q2SELECTcountry,SUM(item,amount)FROMT2GROUPBYcountry其返回數(shù)百條記錄并且從磁盤讀取大約60GB的壓縮數(shù)據(jù)。下一個查詢利用選擇條件對文本字段域執(zhí)行GROUPBY。其讀取大約180GB并且產(chǎn)生大約110萬個不同的域Q3SELECTdomain,SUM(item,amount)FROMT2WHEREdomainCONTAINS’.net’GROUPBYdomain圖14示出了作為服務器拓撲的函數(shù)的每個查詢的執(zhí)行時間。在每種拓撲中,葉服務器的數(shù)量保持恒定為2900,從而可以假設相同的累積掃描速度。在2級拓撲中(I2900),單個根服務器直接與葉服務器進行通信。對于3個級別,使用1:1002900的設置,即100個中間服務器的額外級別。4級拓撲為1:101002900。當在服務樹中使用3個級別時,查詢Q2在3秒內(nèi)運行并且沒有從額外的級別諸多地獲益。與之相比,Q3的執(zhí)行時間由于有所增加的平行而減半。以2個級別,Q3脫離圖表,因為根服務器需要對從數(shù)千個節(jié)點所接收的結果進行近似順序地聚合。該實驗圖示了返回許多群組的聚合如何可以從多級服務樹獲益。每板塊盲方圖。圖15示出了針對Q2和Q3的具體運行板塊多快得到葉服務器的處理。在板塊被電鍍用于在可用時隙中執(zhí)行時的點開始測量時間,即排除了工作隊列中等待所花費的時間。該測量方法以因子析出了同時執(zhí)行的其它查詢的效果。每個直方圖下的面積對應于100%。如圖15所指示的那樣,Q2(或Q3)99%的板塊在一秒(或兩秒)內(nèi)得到處理。記錄內(nèi)聚合。作為另一個實驗,當其在表T3上運行時檢驗查詢Q4的性能。該查詢說明了記錄內(nèi)聚合其對所有記錄進行計數(shù),其中記錄中出現(xiàn)的a.b.c.d值的總和大于a.b.p.q.r值的總和。字段以不同級別的嵌套進行重復。由于列狀條帶,僅從磁盤讀取了(70TB中的)13GB,并且查詢以15秒完成。在不支持嵌套的情況下,在T3上運行該查詢將會是昂貴的。Q4:SELECTCOUNT(cl>c2)FROM(SELECTSUM(a.b.c.d)WITHINRECORDAScl,SUM(a.b.p.q.r)WITHINRECORDASc2FROMT3)可擴展性。以下實驗說明了系統(tǒng)在萬億記錄的表上的可擴展性。以下所示出的查詢Q5選擇前20個aid以及它們在表T4中出現(xiàn)的數(shù)目。以下查詢掃描4.2TB的壓縮數(shù)據(jù)。Q5=SELECTTOP(aid,20),COUNT(*)FROMT4WHEREbid={valuel}ANDcid={value2}該查詢使用系統(tǒng)的四種配置來執(zhí)行,范圍從1000至4000個節(jié)點。執(zhí)行時間處于圖16中。在每次運行中,總過所花費的CPU時間是近似相同的,大約為300K秒,而用戶所感知的時間則隨系統(tǒng)大小的增加而近似線性地減少。該結果提示較大的系統(tǒng)在資源使用方面可以向較小系統(tǒng)一樣有效,但是允許更快的執(zhí)行。掉隊者(StraggIer)。掉隊者可能是例如由于執(zhí)行任務的機器具有操作問題或該機器在處理給定以更高優(yōu)先級的任務時并非足夠積極而沒有被執(zhí)行的任務(例如,對板塊進行處理)。以下的查詢Q6在萬億行的表T5上執(zhí)行。與其它數(shù)據(jù)集合相比,T5被雙路復制。因此,掉隊者延緩了執(zhí)行的可能性更高,原因在于由于對工作進行重新調(diào)度的機會更少。Q6SELECTCOUNT(DISTINCTa)FROMT5查詢Q6讀取ITB的壓縮數(shù)據(jù)。所檢索字段的壓縮比大約為10。如圖17中所指示的,99%的板塊的處理時間低于每時隙每板塊5秒。然而,當在2500個節(jié)點的系統(tǒng)上執(zhí)行時,小部分板塊占用更長時隙,將查詢響應時間從小于一分鐘減緩為數(shù)分鐘。下一部分對實驗結果進行概括。第8部分觀察圖18在對數(shù)規(guī)模上示出了所描述系統(tǒng)典型的按月工作負載中的查詢響應時間分布。如圖18所指示的那樣,大多數(shù)查詢在10秒內(nèi)被處理,良好地處于交互范圍內(nèi)。一些查詢已經(jīng)在繁忙集群中獲得了接近每秒鐘1000億記錄的掃描吞吐量,并且在專用機器上甚至更高。以上所給出的實驗數(shù)據(jù)建議以下觀察·能夠在數(shù)個記錄的磁盤駐留數(shù)據(jù)集合上以交互式速度執(zhí)行基于掃描的查詢;·對于包含數(shù)千節(jié)點的系統(tǒng)可以實現(xiàn)列和服務器數(shù)量近似線性的可擴展性;·MapReduce可以向DBMS—樣從列狀存儲獲益;·記錄整合和解析是昂貴的。(查詢處理層之上的)軟件層可以被優(yōu)化以直接消費面向列的數(shù)據(jù);·MapReduce和查詢處理可以以互補的方式使用,一個層的輸出能夠提供另一個層的輸入;·在多用戶環(huán)境中,較大系統(tǒng)能夠從規(guī)模經(jīng)濟獲益同時提供質量更好的用戶體驗;·如果相對準確性對速度有所妥協(xié)是可接受的,則查詢可以更早終止但是仍看到大多數(shù)數(shù)據(jù);以及·網(wǎng)絡規(guī)模的數(shù)據(jù)集合的塊可以被快速掃描,雖然到最后數(shù)個百分點可能會增加處理時間的量。圖19是用于生成嵌套記錄的列狀存儲表示并對其進行處理的系統(tǒng)的框圖。記錄生成器1904生成來自數(shù)據(jù)源1920的嵌套數(shù)據(jù)的記錄和模式1902。列生成器1908接收記錄1906和模式1902輸入并且輸出表示記錄1906中的數(shù)據(jù)但是為列狀格式的列狀條帶。列狀數(shù)據(jù)1910可以由查詢系統(tǒng)1912就地進行查詢以便產(chǎn)生輸出列1914的不同集合。列狀數(shù)據(jù)1910還可以被記錄整合器1916整合回到記錄形式。記錄整合器所輸出的記錄1918中的每個包括來自集合1906中的原始記錄的字段的子集。輸出記錄1918可以通過基于記錄的數(shù)據(jù)分析程序(例如,MapReduce)對其進行操作。更具體地,數(shù)據(jù)源1920可以包括實質上非結構化的數(shù)據(jù)。實質上非結構化意味著該數(shù)據(jù)可以包括表示結構的元素,但是整個信息譜可能沒有被類似地結構化。作為說明,數(shù)據(jù)源1920可以包括數(shù)百萬網(wǎng)站中每一個的源代碼。雖然每個網(wǎng)站包括一定程度的結構,但是每個網(wǎng)站的內(nèi)容并非基于共用模式所生成。標準可以總體上對站點的格式進行管理,但是字段的內(nèi)容和放置并沒有通過單種模式在每個和各個網(wǎng)站之間進行規(guī)定。在一些示例中,數(shù)據(jù)源1920中的信息并不存儲在共用存儲層1922中,而是直接從互聯(lián)網(wǎng)上的外部源拉取。模式1902定義了可以包含在數(shù)據(jù)源中的信息的共用結構。如本文檔之前所描述的,模式1902能夠要求某些信息字段并且可以允許其它信息字段作為可選的進行存儲。記錄生成器1904接收模式1902以及來自數(shù)據(jù)源1920的信息作為輸入。記錄生成器1904從數(shù)據(jù)源1920取得信息并且將全部或部分信息結構化為符合模式1902的記錄的單獨實例。例如,在數(shù)據(jù)源1920可以包括來自網(wǎng)頁的實質上非結構化的數(shù)據(jù)時,記錄生成器1904可以從每個網(wǎng)頁選擇數(shù)條信息以針對特定記錄1906而包括于其中。因此,每個記錄1906可以包括根據(jù)模式1902結構化的數(shù)據(jù)。結構數(shù)據(jù)可以包括字段,其可以表示數(shù)據(jù)值的語音以及數(shù)據(jù)值的結構關系。因此,可以參考模式以獲得數(shù)據(jù)值的附加定義信息(例如,數(shù)字存儲的數(shù)據(jù)值實際表示什么或者在網(wǎng)頁上表示什么以及與其它值的關系)。每個記錄1906可以包括嵌套字段和數(shù)據(jù)值。嵌套記錄可以包括多于一個的相同名稱或路徑的字段。然而,具有相同名稱或路徑的字段在結構上可以位于特定記錄中的不同位置。例如,模式所定義的單個字段可能能夠重復多次。另外,字段可以具有子字段(即,嵌套字段)。因此,特定字段可以在記錄的頂級進行重復,并且字段的每次重復可以包括或可以不包括特定子字段。換句話說,記錄可以在記錄的一些部分中包括子字段的實例,但是在記錄的其它部分中則不包括。記錄1906的集合可以被轉換為列狀數(shù)據(jù)1910以加速記錄中信息的處理。例如,如果集合1906中的記錄量為數(shù)十億,并且每個記錄可以包括數(shù)百個不同字段,則記錄的分析可能是時間密集的,而其中需要少量字段上的信息是所需要的。這是因為集合1906中的每個記錄與來自該記錄的其它信息一起存儲。也就是說,每個記錄在存儲器的連續(xù)部分中被分組在一起(例如,如圖1的嵌套數(shù)據(jù)的“面向記錄”的描繪中所圖示的那樣)。與之相比,列狀數(shù)據(jù)1910包括列,每個列存儲模式1902中單個字段的信息(例如,如圖1中嵌套數(shù)據(jù)的“面向列”的描繪中所圖示的那樣)。因此,如果字段為一字節(jié)長,則用于字段的列可以為數(shù)十億字節(jié)(例如,每個記錄一個字節(jié))而不是數(shù)十億記錄(例如,其中每個記錄的大小可能為一兆字節(jié))的量級。列生成器1908的操作在第4.2部分“將記錄劃分為列”中更為詳細地進行了描述。列狀數(shù)據(jù)1910的存儲格式在第4.1部分“重復和定義級別”中更為詳細地進行了描述。列狀數(shù)據(jù)1910可以使用查詢系統(tǒng)1912直接進行查詢。換句話說,列狀數(shù)據(jù)1910可以在不將數(shù)據(jù)加載到數(shù)據(jù)庫中的情況下進行查詢。當執(zhí)行查詢時,查詢系統(tǒng)可以接收列狀數(shù)據(jù)的表作為輸入。在一些示例中,查詢系統(tǒng)還接收模式1902作為輸入。列狀條帶可以與模式存儲在一起以進行數(shù)據(jù)的自行描述。查詢系統(tǒng)允許對列狀數(shù)據(jù)執(zhí)行操作以便生成輸出信息的列1914。輸出列1914可以包括如特定查詢所確定的列狀數(shù)據(jù)1910中所表示的值的子集。在一些示例中,查詢系統(tǒng)輸出記錄1918而不是列1914,或者除了列1914之外還輸出記錄1918。例如,查詢系統(tǒng)1912可以接收第一查詢,并且作為響應,可以通過選擇數(shù)據(jù)列并生成輸出列的集合進行解析,該輸出列提供具有一個或多個視頻的所有網(wǎng)頁的標題以及每個網(wǎng)頁的視頻數(shù)目。查詢系統(tǒng)可以接收第二查詢,并且作為響應輸出輸出列的第二集合,其提供最近十五分鐘內(nèi)所生成的每個網(wǎng)頁的URL。來自列1910的其它信息可以不包括在對應于特定查詢1914的輸出列的集合中。作為列狀數(shù)據(jù)1910存儲的數(shù)據(jù)可能需要由并不對列狀數(shù)據(jù)進行操作而是對記錄進行操作的分析服務進行訪問。因此,記錄整合器1916可以接收列狀數(shù)據(jù)以及來自列狀數(shù)據(jù)的整合記錄作為輸入。對記錄進行整合的處理在第4.3部分“記錄整合”中更為詳細地進行了描述。雖然記錄在集合1906中可能已經(jīng)是可用的,但是記錄整合器1916使得能夠生成包括集合1906中的記錄的字段子集的記錄集合。例如,該集合中的記錄可以包括數(shù)千個不同字段。用戶可能想要運行僅需要來自兩個字段而非所有記錄的知識的面向記錄的分析程序。因此,記錄整合器1916可以生成僅包括所請求字段上的信息的記錄集合。以這種方式,能夠針對不同分析或針對不同分析程序開發(fā)多個輸出記錄集合1918。對較小記錄的分析會比必須對集合1906中可能找到的較大記錄進行遍歷的分析更為快速。以上對系統(tǒng)1900的操作的描述圖示了記錄集合1906包括依據(jù)模式1902進行格式化的記錄并且從該類似結構的數(shù)據(jù)的單個集合生成列狀數(shù)據(jù)1910的示例。在各種示例中,多個模式1902可以被用來生成包括許多不同結構的記錄的集合1906的記錄集合。然而,每個記錄可以在報頭中標識出記錄生成中所使用模式的類型。類似地,可以對許多類似結構的記錄的集合中的每一個中的每個字段生成列狀條帶。每個列狀條帶不僅可以指示字段名,而且還指示列狀數(shù)據(jù)與之相關聯(lián)的模式(即,用來對從其生成該列狀數(shù)據(jù)的記錄進行格式化的模式)。圖20是用于生成列狀數(shù)據(jù)的示例過程的流程圖。該過程可以由系統(tǒng)1900的組件來執(zhí)行。在框2002,生成記錄的集合。記錄的生成可以由記錄生成器1904來執(zhí)行。(例如,來自數(shù)據(jù)源1920的)非結構化數(shù)據(jù)可以被編譯為模式1902所定義的標準化記錄格式。記錄可以被存儲在集合1906中。在框2004,訪問集合1906中的記錄。例如,列生成器1908從記錄集合1906接收數(shù)據(jù)作為輸入。在框2006,確定是否要針對附加字段生成列狀條帶。例如,要對集合1906中所存儲的記錄集合中的每個字段(并且因此為模式1902中的每個記錄及其子集)生成條帶。在該說明中,還沒有形成條帶,并且因此存在要對其生成條帶的字段。因此,該過程進行至2008以便對特定字段執(zhí)行操作。如果所有條帶都已經(jīng)被生成(例如,已經(jīng)為記錄集合1906中的每個字段生成了條帶),則該過程可以結束。在框2008,為特定字段生成值列表。例如,可以對每個記錄進行遍歷并且為特定字段生成值列表。在框2010,為特定字段生成重復級別。例如,列生成器1908可以通過確定字段的路徑中最近重復的字段而為列表中的每個值確定重復級別。在框2012,為特定字段生成定義級別。例如,列生成器1908可以為每個值(如以上更為詳細描述的,包括“缺失的”值)確定定義級別。在框2014,針對特定字段整合列狀條帶。在各種示例中,重復和定義級別被置于條帶報頭中的成對分組中。該值列表可以被置于條帶體之中。在框2016,將列狀條帶分解為可以被壓縮的塊。每個塊可以包括一組值及其相對應的重復和定義級別。隨后,在框2006執(zhí)行是否要對附加字段生成列狀條帶的確定。如果沒有附加的列狀條帶有待生成,則該過程結束。圖20所描繪的過程是用于生成列狀條帶的示例過程。預見到對于該過程的變化。例如,各框的操作可以并非如流程圖中所描繪的順序執(zhí)行。多個字段的條帶可以一次生成。重復級別和定義級別可以在從記錄獲得每個值時被生成。列狀條帶可以不作為整體生成。相反,可以從條帶生成每個塊并且對他們進行獨立壓縮。因此,該流程圖可以表示用于理解條帶生成的概念性機制而并非旨在作為限制。用于生成列狀數(shù)據(jù)的過程在圖4的算法中進行了描繪,其可以并不對應于關于圖20所描述的操作。圖21是可被用來實現(xiàn)這里所描述的系統(tǒng)和方法的計算設備2100、2150的框圖。計算設備2100旨在表示各種形式的數(shù)字計算機,諸如膝上計算機、臺式機、工作站、個人數(shù)字助理、服務器、刀鋒服務器、大型機和其它適當計算機。計算設備2150旨在表示各種形式的移動設備,諸如個人數(shù)字助理、移動電話、智能電話和其它類似的計算設備。此外,計算設備2100或2150可以包括通用串行總線(USB)閃存驅動。USB閃存驅動可以存儲操作系統(tǒng)和其它應用。USB閃存驅動可以包括諸如無線傳送器或USB連接器之類的可以插入另一計算設備的USB端口的輸入/輸出組件。這里所示出的組件、其連接和關系以及其功能僅旨在進行示例,而并非旨在對本文檔中所描述和/或要求保護的發(fā)明的實現(xiàn)進行限制。計算設備2100包括處理器2102、存儲器2104、存儲設備2106、連接到存儲器2104和高速擴展端口2110的高速接口2108,以及連接到低速總線2114和存儲設備2106的低速接口2112。組件2102、2104、2106、2108、2110和2112中的每個使用各種總線進行互連,并且可以安裝在共用主板上,或者以其它適宜方式進行安裝。處理器2102能夠處理指令以便在計算設備2100內(nèi)執(zhí)行,該指令包括存儲在存儲器2104中或者存儲設備2106上以在諸如耦合到高速接口2108的顯示器2116的外部輸入/輸出設備上顯示用于⑶I的圖形信息的指令。在其它實現(xiàn)中,可適當?shù)厥褂枚鄠€處理器和/或多個總線,以及多個存儲器和存儲器類型。而且,多個計算設備2100可以與提供各部分必要操作的每個設備進行連接(例如,作為服務器組、刀鋒服務器分組或多處理器系統(tǒng))。存儲器2104存儲計算設備2100內(nèi)的信息。在一種實現(xiàn)中,存儲器2104是一個或多個易失性存儲單元。在另一實現(xiàn)中,存儲器2104是一個或多個非易失性存儲單元。存儲器2104還可以是其它形式的計算機可讀介質,諸如磁盤或光盤。存儲設備2106能夠為計算設備2100提供大型存儲。在一種實現(xiàn)中,存儲設備2106可以是或者可包含計算機可讀介質,諸如軟盤設備、硬盤設備、光盤設備、磁帶設備、閃存或其它類似固態(tài)存儲設備、或者設備陣列,包括存儲域網(wǎng)絡或其它配置中的設備。計算機程序產(chǎn)品可有形實現(xiàn)在信息載體中。所述計算機程序產(chǎn)品還可包含指令,當被執(zhí)行時,所述指令執(zhí)行諸如以上所描述的一個或多個方法。所述信息載體是計算機或機器可讀介質,諸如存儲器2104、存儲設備2106、處理器2102上的存儲器。高速控制器2108管理用于計算設備2100的帶寬密集操作,而低速控制器2112管理較低帶寬密集的操作。這樣的功能分配僅是示例性的。在一種實現(xiàn)中,高速控制器2108耦合到存儲器2104、顯示器2116(例如,通過圖形處理器或加速器),并且耦合到可接受各種擴展卡(未示出)的高速擴展端口2110。在所述實現(xiàn)中,低速控制器2112耦合到存儲設備2106和低速擴展端口2114??梢园ǜ鞣N通信端口(例如,USB、藍牙、以太網(wǎng)、無線以太網(wǎng))的低速控制端口2114可耦合到一個或多個輸入/輸出設備,諸如鍵盤、指點設備、掃描儀,或者例如通過網(wǎng)絡適配器耦合到諸如交換機和路由器之類的聯(lián)網(wǎng)設備。如圖所示,計算設備2100能夠以各種不同形式來實現(xiàn)。例如,其可以實現(xiàn)為標準服務器2120,或者這種服務器群組中的多次器。其還可以被實現(xiàn)為機架式服務器系統(tǒng)2124的一部分。此外,其還可以在諸如膝上計算機2122的個人計算機中實現(xiàn)。備選地,來自計算設備2100的組件可以與諸如設備2150的移動設備(未示出)中的其它組件相結合。每個這樣的設備可包含一個或多個計算設備2100、2150,并且整個系統(tǒng)可由多個彼此通信的計算設備2100、2150所構成。除其它組件之外,計算設備2150包括處理器2152、存儲器2164、諸如顯示器2154之類的輸入/輸出設備、通信接口2166和收發(fā)器2168。設備2150還可提供以諸如微驅動器或其它設備的存儲設備以提供附加存儲。每個組件2150、2152、2164、2154、2166和2168使用各種總線進行互連,并且若干組件可裝配在共用主板上或者以其它適宜方式進行安裝。處理器2152能夠執(zhí)行計算設備2150內(nèi)的指令,包括存儲在存儲器2164中的指令。所述處理器可被實現(xiàn)為包括單獨且多個的模擬和數(shù)字處理器的芯片的芯片組。此外,處理器可以使用任意數(shù)量的架構來實現(xiàn)。例如,處理器410可以是CISC(復雜指令集計算機)處理器、RISC(精簡指令集計算機)處理器或MISC(最小指令集計算機)處理器。例如,所述處理器可提供用于設備2150的其它組件的協(xié)同,諸如用戶接口控件、設備2150所運行的應用程序以及設備2150所進行的無線通信。處理器2152可以通過耦合到顯示器2154的控制接口2158和顯示器接口2156與用戶進行通信。顯示器2154例如可以是TFTIXD(薄膜晶體管液晶顯示器)顯示器或OLED(有機發(fā)光二極管)顯示器,或者其它適當?shù)娘@示技術。顯示器接口2156可以包括用于驅動顯示器2154向用戶呈現(xiàn)圖形和其它信息的適當電路??刂平涌?158可以從用戶接收命令并且對其進行轉以便向處理器2152進行提交。此外,可提供與處理器2152進行通信的外部接口2162,從而使得設備2150能夠與其它設備進行近域通信。例如,外部接口2162在一些實現(xiàn)中可提供有線通信,或者在其它實現(xiàn)中提供無線通信,并且也可使用多個接口。存儲器2164存儲計算設備2150內(nèi)的信息。存儲器2164可以實現(xiàn)為一個或多個計算機可讀介質或媒體、一個或多個易失性存儲器單元或者一個或多個非易失性存儲器單元。也以提供擴展存儲器2174并通過擴展接口2172連接到設備2150,例如,所述擴展接口2172可以包括SIMM(單列存儲組模)卡接口。這樣的擴展存儲器2174可為設備2150提供額外的存儲空間,或者還可以為設備2150存儲應用程序或其它信息。特別地,擴展存儲器2174可以包括指令以執(zhí)行或補充以上所描述的過程,并且還可以包括安全信息。例如,擴展存儲器2174由此可被提供作為設備2150的安全模塊,并且可利用允許對設備2150進行安全使用的指令進行編程。此外,可經(jīng)由SIMM卡提供安全應用程序以及附加信息,諸如以不可破壞的方式在SIMM卡上設置識別信息。例如,如以下所描述的那樣,所述存儲器可以包括閃存和/或NVRAM存儲器。在一種實現(xiàn)中,計算機程序產(chǎn)品有形實現(xiàn)在信息載體中。所述計算機程序產(chǎn)品還可包含指令,當被執(zhí)行時,所述指令執(zhí)行諸如以上所描述的一個或多個方法。所述信息載體是計算機或機器可讀介質,諸如存儲器2164、擴展存儲器2174、處理器2152上的可例如通過收發(fā)器2168或外部接口2162上進行接收的存儲器。設備2150可通過通信接口2166進行無線通信,必要時,所述通信接口2166包括數(shù)字信號處理電路。通信接口2166可在各種模式或協(xié)議下提供通信,除其它之外,所述模式或協(xié)議諸如GSM語音呼叫、SMS、EMS或MMS消息發(fā)送、CDMA、TDMA,PDC、WCDMA,CDMA2000或GPRS。例如,這樣的通信可通過射頻收發(fā)器2168進行。此外,諸如可使用藍牙、WiFi或其它這樣的收發(fā)器(未示出)進行短范圍通信。此外,GPS(全球定位系統(tǒng))接收器模塊2170可為設備2150提供附加的導航和位置相關的無線數(shù)據(jù),其可由設備2150上運行的應用程序適當使用。設備2150還使用音頻編解碼器2160進行可聽通信,所述音頻編解碼器2160接收來自用戶的話音信息并且將其轉換為可用的數(shù)字信息。音頻編解碼器2160同樣可以諸如通過揚聲器,例如在設備2150的聽筒中,為用戶生成可聽聲音。這樣的聲音可以包括來自語音電話呼叫的聲音,可以包括錄制的聲音(例如,語音消息、音樂文件等),并且還可以包括設備2150上運行的應用程序所生成的聲音。如圖所示,計算設備2150可以以多種不同方式來實現(xiàn)。例如,其可以實現(xiàn)為移動電話2180。其還可以實現(xiàn)為智能電話2182、個人數(shù)字助理或其它類似移動設備的一部分。這里所描述的系統(tǒng)和技術的各種實現(xiàn)可以以數(shù)字電路、集成電路、專門設計的ASIC(專用集成電路)、計算機硬件、固件、軟件和/或其組合來實現(xiàn)。這些各種實現(xiàn)可以包括一個或多個計算機程序中的實現(xiàn),所述計算機程序可在包括至少一個可編程處理器的可編程系統(tǒng)上執(zhí)行和/或解釋,所述可編程系統(tǒng)可以為專用或通用,其耦合以從存儲設備、至少一個輸入設備以及至少一個輸出設備接收數(shù)據(jù)和指令并且向其傳送數(shù)據(jù)和指令。這些計算機程序(也稱作程序、軟件、軟件應用程序或代碼)包括用于可編程處理器的機器指令,并且能夠以高級程序化和/或面向對象編程語言來實現(xiàn),和/或以匯編/機器語言來實現(xiàn)。如這里所使用的那樣,術語“機器可讀介質”、“計算機可讀介質”是指用來向可編程處理器提供機器指令和/或數(shù)據(jù)的任意計算機程序產(chǎn)品、裝置和/或設備(例如,磁碟、光盤、存儲器、可編程邏輯設備PLD),其包括接收機器指令作為機器可讀信號的機器可讀介質。術語“機器可讀信號”是指被用來為可編程處理器提供機器指令和/或數(shù)據(jù)的任意信號。為了提供與用戶的交互,這里所描述的系統(tǒng)和技術可在具有用于向用戶顯示信息的顯示設備(例如,CRT(陰極射線管)或LCD(液晶顯示器)監(jiān)視器)和用戶能夠通過其為計算機提供輸入的鍵盤和指點設備(例如,鼠標或軌跡球)的計算機上實現(xiàn)。也可以使用其它類型的設備來提供與用戶的交互;例如,提供給用戶的反饋可以為任意形式的傳感器反饋(例如,視覺反饋、聽覺反饋或觸覺反饋);并且來自用戶的輸入可以以任意形式接收,包括聲音、話音或觸覺輸入。這里所描述的系統(tǒng)和技術可在計算系統(tǒng)中實現(xiàn),所述計算系統(tǒng)包括后端組件(例如,數(shù)據(jù)服務器),或者其包括中間件組件(例如,應用服務器),或者其包括前端組件(例如,具有用戶能夠通過其與這里所描述的系統(tǒng)和技術的實施方式進行交互的圖形用戶界面或網(wǎng)絡瀏覽器的客戶端計算機),或者這些后端、中間件或前端組件的任意組合。所述系統(tǒng)的組件可通過任意形式的介質或數(shù)字數(shù)據(jù)通信(例如,通信網(wǎng)絡)進行互連。通信網(wǎng)絡的示例包括局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、(具有ad-hoc或靜態(tài)成員的)對等網(wǎng)絡、網(wǎng)格計算基礎設施和互聯(lián)網(wǎng)。該計算系統(tǒng)可以包括客戶端和服務器??蛻舳撕头掌魍ǔ1舜诉h離并且典型地通過通信網(wǎng)絡進行交互。客戶端和服務器的關系源自于在各自計算機上運行的計算機程序并且具有彼此的客戶端-服務器關系。雖然以上已經(jīng)對一些實現(xiàn)進行了詳細描述,但是其它修改也是可能的。此外,可以使用用于生成并處理嵌套記錄的列狀存儲表示的其它機制。此外,圖中所描繪的邏輯流程并不要求所示出的特定順序或序列順序來實現(xiàn)所期望的結果??梢蕴峁┢渌襟E,或者可以從所描述的流程中刪除步驟,并且可以向所描述的系統(tǒng)添加其它組件或者從中去除組件。因此,其它實現(xiàn)處于以下權利要求的范圍之內(nèi)。權利要求1.一種計算機實現(xiàn)的方法,包括由計算系統(tǒng)訪問存儲在計算機存儲器中的數(shù)據(jù)記錄集合,所述數(shù)據(jù)記錄集合中的每個記錄包括多個數(shù)據(jù)值以及標識出來自所述多個數(shù)據(jù)值的對應數(shù)據(jù)值的語義的多個數(shù)據(jù)元素,所述數(shù)據(jù)記錄集合中的一個或多個數(shù)據(jù)記錄中的每個包括相同數(shù)據(jù)元素的多個實例,并且包括對應于所述相同數(shù)據(jù)元素的所述多個實例的數(shù)據(jù)值;由所述計算系統(tǒng)生成列狀條帶集合,所述列狀條帶集合包括來自所述數(shù)據(jù)記錄集合中的每個數(shù)據(jù)記錄的所述數(shù)據(jù)值,所述列狀條帶集合中的每個列狀條帶包括對應于來自所述記錄集合中的每個所述記錄的具體數(shù)據(jù)元素的所有數(shù)據(jù)值。2.根據(jù)權利要求1的方法,進一步包括由所述計算系統(tǒng)針對所述列狀條帶集合中每個列狀條帶中的每個數(shù)據(jù)值生成標識出來自所述數(shù)據(jù)記錄集合的相應數(shù)據(jù)記錄中的相應數(shù)據(jù)值的位置的數(shù)據(jù)。3.根據(jù)權利要求2的方法,其中所述數(shù)據(jù)由重復值和定義值所構成。4.根據(jù)權利要求2至3中任一項的方法,進一步包括根據(jù)(i)所述列狀條帶集合中的所述列狀條帶,和(ii)所述數(shù)據(jù)來重構僅包含來自所述數(shù)據(jù)記錄集合中的所述記錄的數(shù)據(jù)元素的子集的記錄集合。5.根據(jù)權利要求1至4中任一項的方法,進一步包括生成所述列狀條帶集合中每個特定數(shù)據(jù)值的重復值,以與所述列狀條帶集合中的所述數(shù)據(jù)值一起存儲,其中每個特定數(shù)據(jù)元素的路徑包括對所述特定數(shù)據(jù)元素的任意一個或多個父數(shù)據(jù)元素;其中每個特定數(shù)據(jù)值的所述重復值標識出對應于所述特定數(shù)據(jù)值的所述特定數(shù)據(jù)元素的所述路徑中最近重復過的數(shù)據(jù)元素;其中所述特定數(shù)據(jù)元素的所述路徑中的所述最近重復過的數(shù)據(jù)元素是在包括所述特定數(shù)據(jù)值的特定數(shù)據(jù)記錄的分析期間在所述特定數(shù)據(jù)元素的所述路徑中第二次遇到的數(shù)據(jù)元素,所述分析從所述特定數(shù)據(jù)值在所述特定數(shù)據(jù)記錄中的位置向上朝著所述特定數(shù)據(jù)記錄的開始進行。6.根據(jù)權利要求1至5中任一項的方法,其中所述數(shù)據(jù)元素集合中所包括的所述數(shù)據(jù)元素中的每個特定數(shù)據(jù)元素與包括對所述特定數(shù)據(jù)元素的任意一個或多個所述父數(shù)據(jù)元素的相應路徑相關聯(lián);進一步包括生成所述數(shù)據(jù)記錄集合中的每個特定路徑或所述特定路徑的部分的定義值,以與所述列狀條帶中的所述數(shù)據(jù)值一起存儲;其中所述特定路徑或所述特定路徑的部分的定義級別標識出所述特定路徑或路徑的部分中所包括的數(shù)據(jù)元素的數(shù)量。7.根據(jù)權利要求1至6中任一項的方法,進一步包括由所述計算系統(tǒng)從數(shù)據(jù)源集合接收信息,每個數(shù)據(jù)源包括未根據(jù)模式而結構化的信息;以及由所述計算系統(tǒng)通過根據(jù)所述模式對每個數(shù)據(jù)源中的所述信息進行結構化而生成所述數(shù)據(jù)記錄集合中的每個數(shù)據(jù)記錄。8.根據(jù)權利要求1至7中任一項的方法,進一步包括由所述計算系統(tǒng)執(zhí)行對所述列狀條帶集合的查詢;以及由所述計算系統(tǒng)且響應于所述查詢的執(zhí)行而輸出新的列狀條帶,所述新的列狀條帶包括來自由所述查詢所標識出的所述列狀條帶集合的列狀條帶的值的子集。9.根據(jù)權利要求8的方法,其中執(zhí)行所述列狀條帶集合的所述查詢而并不將所述列狀條帶集合中所包括的所述數(shù)據(jù)值加載到數(shù)據(jù)庫中。10.根據(jù)權利要求1至9中任一項的方法,其中所述列狀條帶集合的至少第一列狀條帶包括多個數(shù)據(jù)塊,所述多個數(shù)據(jù)塊中的至少一些數(shù)據(jù)塊中的每個包括定義了在每個塊的值中所找到的值類型的聲明值,從而使得在執(zhí)行所述第一列狀條帶的查詢時,所述計算系統(tǒng)避免不包括由所述查詢所指定的數(shù)據(jù)值的一個或多個數(shù)據(jù)塊。11.根據(jù)權利要求1至10中任一項的方法,其中所述列狀條帶集合的第一列狀條帶包括來自所述數(shù)據(jù)記錄集合中的對應于所述數(shù)據(jù)記錄集合中的第一數(shù)據(jù)元素的實例的數(shù)據(jù)記錄中的所有數(shù)據(jù)值,作為第一數(shù)據(jù)值;并且所述第一列狀條帶在存儲器中連續(xù)存儲多個所述第一數(shù)據(jù)值,其中所述多個第一數(shù)據(jù)值在所述多個第一數(shù)據(jù)值存儲在所述數(shù)據(jù)記錄集合中的數(shù)據(jù)記錄中時,并不在存儲器中連續(xù)存儲。12.根據(jù)權利要求1至11中任一項的方法,其中所述數(shù)據(jù)記錄集合中的至少一個數(shù)據(jù)記錄包括根據(jù)嵌套數(shù)據(jù)模型所存儲的數(shù)據(jù)元素和對應的數(shù)據(jù)值。13.根據(jù)權利要求1至12中任一項的方法,其中第一數(shù)據(jù)記錄包括第一數(shù)據(jù)元素和第二數(shù)據(jù)元素,所述第一數(shù)據(jù)元素是所述第二數(shù)據(jù)元素的父數(shù)據(jù)元素,并且所述第二數(shù)據(jù)元素是所述第一數(shù)據(jù)元素的子數(shù)據(jù)元素;第一列狀條帶包括對應于所述第一數(shù)據(jù)記錄中的所述第一數(shù)據(jù)元素的數(shù)據(jù)值以及對應于所述數(shù)據(jù)記錄集合中的所述第一數(shù)據(jù)元素的實例的所有其它數(shù)據(jù)值;并且第二列狀條帶包括對應于所述第一數(shù)據(jù)記錄中的所述第二數(shù)據(jù)元素的數(shù)據(jù)值以及對應于所述數(shù)據(jù)記錄集合中的所述第二數(shù)據(jù)元素的實例的所有其它數(shù)據(jù)值。14.一種有形存儲在計算機可讀存儲設備上的計算機程序產(chǎn)品,所述產(chǎn)品包括計算機程序指令,所述計算機程序指令可操作以使得一個或多個處理器執(zhí)行操作,所述操作包括由計算系統(tǒng)訪問存儲在計算機存儲器中的數(shù)據(jù)記錄集合,所述數(shù)據(jù)記錄集合中的每個記錄包括多個數(shù)據(jù)值以及標識出來自所述多個數(shù)據(jù)值的對應數(shù)據(jù)值的語義的多個數(shù)據(jù)元素,所述數(shù)據(jù)記錄集合中的一個或多個所述數(shù)據(jù)記錄中的每個包括相同數(shù)據(jù)元素的多個實例,并且包括對應于所述相同數(shù)據(jù)元素的所述多個實例的數(shù)據(jù)值;由所述計算系統(tǒng)生成列狀條帶集合,所述列狀條帶集合包括來自所述數(shù)據(jù)記錄集合中的每個數(shù)據(jù)記錄的所述數(shù)據(jù)值,所述列狀條帶集合中的每個列狀條帶包括對應于來自所述記錄集合中的每個所述記錄的具體數(shù)據(jù)元素的所有數(shù)據(jù)值。15.—種系統(tǒng),包括一個或多個可編程處理器;以及計算機可讀存儲設備,其耦合至所述處理器并且具有存儲于其中的指令,當所述指令由所述一個或多個可編程處理器執(zhí)行時,使得所述一個或多個可編程處理器執(zhí)行操作,所述操作包括由計算系統(tǒng)訪問存儲在計算機存儲器中的數(shù)據(jù)記錄集合,所述數(shù)據(jù)記錄集合中的每個記錄包括多個數(shù)據(jù)值以及標識出來自所述多個數(shù)據(jù)值的對應數(shù)據(jù)值的語義的多個數(shù)據(jù)元素,所述數(shù)據(jù)記錄集合中的一個或多個所述數(shù)據(jù)記錄中的每個包括相同數(shù)據(jù)元素的多個實例,并且包括對應于所述相同數(shù)據(jù)元素的所述多個實例的數(shù)據(jù)值;由所述計算系統(tǒng)生成列狀條帶集合,所述列狀條帶集合包括來自所述數(shù)據(jù)記錄集合中的每個數(shù)據(jù)記錄的所述數(shù)據(jù)值,所述列狀條帶集合中的每個列狀條帶包括對應于來自所述記錄集合中的每個所述記錄的具體數(shù)據(jù)元素的所有數(shù)據(jù)值。全文摘要計算機系統(tǒng)訪問數(shù)據(jù)記錄的集合。該集合中的每個記錄包括多個數(shù)據(jù)值以及從該多個數(shù)據(jù)值標識出相對應數(shù)據(jù)值的語義的多個數(shù)據(jù)元素。一個或多個數(shù)據(jù)記錄中的每個包括相同數(shù)據(jù)元素的多個實例,并且包括對應于該相同數(shù)據(jù)元素的多個實例的數(shù)據(jù)值。該計算機系統(tǒng)生成列狀條帶的集合。該列狀條帶集合包括來自數(shù)據(jù)記錄集合中的每個數(shù)據(jù)記錄的數(shù)據(jù)值。該列狀條帶集合中的每個列狀條帶包括對應于來自記錄集合中的每個記錄的具體數(shù)據(jù)元素的所有數(shù)據(jù)值。文檔編號G06F17/30GK103003813SQ201180021717公開日2013年3月27日申請日期2011年4月4日優(yōu)先權日2010年4月5日發(fā)明者A·古巴雷夫,S·梅爾尼克,J·J·隆,G·M·羅梅爾,N·施瓦屈瑪爾,M·B·托爾頓,T·瓦西拉基斯申請人:谷歌公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
宿松县| 拜泉县| 集贤县| 福安市| 鄂托克前旗| 常宁市| 江北区| 五原县| 水富县| 罗田县| 宝坻区| 会东县| 台湾省| 于都县| 中西区| 图木舒克市| 磐石市| 买车| 桃园市| 汝南县| 莱芜市| 休宁县| 上杭县| 嫩江县| 常宁市| 灵璧县| 陆良县| 鲁甸县| 五大连池市| 明溪县| 湘西| 周至县| 尼玛县| 德格县| 池州市| 青岛市| 奉新县| 乌什县| 柏乡县| 泰安市| 峨边|