天天看點

Apache Kylin權威指南2.2 在Hive中準備資料

<b>2.2 在hive中準備資料</b>

<b></b>

2.1節介紹了kylin中的常見概念。本節将介紹準備hive資料的一些注意事項。需要被分析的資料必須先儲存為hive表的形式,然後kylin才能從hive中導入資料,建立cube。

apache hive是一個基于hadoop的資料倉庫工具,最初由facebook開發并貢獻到apache軟體基金會。hive可以将結構化的資料檔案映射為資料庫表,并可以将sql語句轉換為mapreduce或tez任務進行運作,進而讓使用者以類sql(hiveql,也稱hql)的方式管理和查詢hadoop上的海量資料。

此外,hive還提供了多種方式(如指令行、api和web服務等)可供第三方友善地擷取和使用中繼資料并進行查詢。今天,hive已經成為hadoop資料倉庫的首選,是hadoop上不可或缺的一個重要元件,很多項目都已相容或內建了hive。基于此情況,kylin選擇hive作為原始資料的主要來源。

在hive中準備待分析的資料是使用kylin的前提;将資料導入到hive表中的方法有很多,使用者管理資料的技術和工具也各式各樣,是以具體步驟不在本書的讨論範圍之内。如有需要可以參考hive的使用文檔。這裡将着重闡述需要注意的幾個事項。

2.2.1 星形模型

資料挖掘有幾種常見的多元資料模型,如星形模型(star schema)、雪花模型(snowf?lake schema)、事實星座模型(fact constellation)等。

星形模型中有一張事實表,以及零個或多個次元表;事實表與次元表通過主鍵外鍵相關聯,次元表之間沒有關聯,就像很多星星圍繞在一個恒星周圍,故取名為星形模型。

如果将星形模型中某些次元的表再做規範,抽取成更細的次元表,然後讓次元表之間也進行關聯,那麼這種模型稱為雪花模型。

星座模型是更複雜的模型,其中包含了多個事實表,而次元表是公用的,可以共享。

不過,kylin隻支援星形模型的資料集,這是基于以下考慮。

星形模型是最簡單,也是最常用的模型。

由于星形模型隻有一張大表,是以它相比于其他模型更适合于大資料處理。

其他模型可以通過一定的轉換,變為星形模型。

2.2.2 次元表的設計

除了資料模型以外,kylin還對次元表有一定的要求,具體要求如下。

1)要具有資料一緻性,主鍵值必須是唯一的;kylin會進行檢查,如果有兩行的主鍵值相同則會報錯。

2)次元表越小越好,因為kylin會将次元表加載到記憶體中供查詢;過大的表不适合作為次元表,預設的門檻值是300mb。

3)改變頻率低,kylin會在每次建構中試圖重用次元表的快照,如果次元表經常改變的話,重用就會失效,這就會導緻要經常對次元表建立快照。

4)次元表最好不要是hive視圖(view),雖然在kylin 1.5.3中加入了對次元表是視圖這種情況的支援,但每次都需要将視圖進行物化,進而導緻額外的時間開銷。

2.2.3 hive表分區

hive表支援多分區(partition)。簡單地說,一個分區就是一個檔案目錄,存儲了特定的資料檔案。當有新的資料生成的時候,可以将資料加載到指定的分區,讀取資料的時候也可以指定分區。對于sql查詢,如果查詢中指定了分區列的屬性條件,則hive會智能地選擇特定分區(也就是目錄),進而避免全量資料的掃描,減少讀寫操作對叢集的壓力。

下面列舉的一組sql示範了如何使用分區:

hive&gt; create table invites (id int, name string) partitioned by (ds string) row format delimited fields terminated by 't' stored as textfile;?

hive&gt; load data local inpath '/user/hadoop/data.txt' overwrite into table invites partition (ds='2016-08-16');?

hive&gt; select * from invites where ds ='2016-08-16';

kylin支援增量的cube建構,通常是按時間屬性來增量地從hive表中抽取資料。如果hive表正好是按此時間屬性做分區的話,那麼就可以利用到hive分區的好處,每次在hive建構的時候都可以直接跳過不相幹日期的資料,節省cube建構的時間。這樣的列在kylin裡也稱為分割時間列(partition time column),通常它應該也是hive表的分區列。

2.2.4 了解次元的基數

次元的基數(cardinality)指的是該次元在資料集中出現的不同值的個數;例如“國家”是一個次元,如果有200個不同的值,那麼此次元的基數就是200。通常一個次元的基數會從幾十到幾萬個不等,個别次元如“使用者id”的基數會超過百萬甚至千萬。基數超過一百萬的次元通常被稱為超高基數次元(ultra high cardinality,uhc),需要引起設計者的注意。

cube中所有次元的基數都可以展現出cube的複雜度,如果一個cube中有好幾個超高基數次元,那麼這個cube膨脹的機率就會很高。在建立cube前需要對所有次元的基數做一個了解,這樣就可以幫助設計合理的cube。計算基數有多種途徑,最簡單的方法就是讓hive執行一個count distinct的sql查詢;kylin也提供了計算基數的方法,在2.3.1節中會進行介紹。

2.2.5 sample data

如果需要一些簡單資料來快速體驗apache kylin,也可以使用apache kylin自帶的sample data。運作“${kylin_home}/bin/sample.sh”來導入sample data,然後就能按照下面的流程繼續建立模型和cube。

具體請執行下面指令,将sample data導入hive資料庫。

cd ${kylin_home}

bin/sample.sh

sample data測試的樣例資料集總共僅1mb左右,共計3張表,其中事實表有10000條資料。因為資料規模較小,有利于在虛拟機中進行快速實踐和操作。資料集是一個規範的星形模型結構,它總共包含了3個資料表:

kylin_sales是事實表,儲存了銷售訂單的明細資訊。各列分别儲存着賣家、商品分類、訂單金額、商品數量等資訊,每一行對應着一筆交易訂單。

kylin_category_groupings是維表,儲存了商品分類的詳細介紹,例如商品分類名稱等。

kylin_cal_dt也是維表,儲存了時間的擴充資訊。如單個日期所在的年始、月始、周始、年份、月份等。

這3張表一起構成了整個星形模型。