【Kylin實戰】Hive複雜資料型別與檢視
1. 引言
在分析廣告日誌時,會有這樣的多維分析需求:
- 曝光、點選使用者分別有多少?
- 標籤能覆蓋多少廣告使用者?
- 各個標籤(標註)類別能覆蓋的曝光、點選在各個DSP上所覆蓋的使用者數
- ……
廣告資料與標籤資料join之後,儲存orc file的schema如下:
create external table default.ad_tag ( uid string ,dsp string ,view string ,click string ,tags array<struct<tag:string,label:string,src:string>> ) partitioned by (day_time date) stored as orc location '/<path>/<to>';
使用者可能會有多個標籤,因此採用array<struct>
資料型別來作為使用者的標籤欄位。可是,當用Kylin做多維分析時,會出現問題——Kylin只能匯入扁平化的Hive表,簡而言之,其不支援Hive的複雜資料型別,如array、struct、map等。為了解決這個問題,我們希望能從這張ad_tag
表中抽象出一張扁平化的邏輯表,並且這張邏輯表的partition能跟ad_tag
表保持同步更新。
2. 檢視
眾所周知,在RDBMS中,檢視(view)可用來抽象出邏輯表,比如,得到CS系所開設的所有課程及相關教師資訊:
create view as select course, teacher, building from teaches, teacher_table where teaches.teacher_id = teacher_table.teacher_id and teaches.dept_name = 'CS'
在有一些資料庫解決方案中提供了物化檢視(materialize view),即物理儲存檢視。同RDBMS一樣,Hive也提供檢視,但檢視不能被物化。在Hive中建立檢視時,只是將該檢視的元資訊寫進metastore;只有在執行引用檢視語句時,才會觸發其select子句的執行。雖然Hive不能物化檢視,但提供了其等價解決方案——由一張表生成另外一張表:
create table
as select ...
這種類物化的方式,在建立表時會觸發select子句的執行,存在缺點:對於partition增量更新表,做不到view的partition與之同時更新。所以,對於我們的場景不太適用。
3. inline
如何在建立檢視時,將複雜資料型別平鋪開來呢?Hive內建UDTF做這種平鋪化(flatten)操作,但是UDTF並不能配合select用,而在lateral view子句中使用;比如,explode平鋪array:
select pageid, adid
from pageAds
lateral view explode(adid_list) adTable as adid;
inline平鋪array<struct>
:
select *
from test_bid
lateral view inline(tags) tag_table_1;
4. Partition
資料在增量更新,對應地partition也在變化,建立的檢視也應同步partition的變化;並且,Kylin的增量cube是根據hive表的partition進行refresh的。因此,該檢視應保持與基礎表相同的partition。正好,Hive提供PartitionedView,為view新增partition。完整地建立檢視的命令如下:
create view if not exists ad_tag_view
partitioned on (day_time)
as
select uid, dsp, view, click, tag, label, src, day_time
from ad_tag lateral view inline(tags) tags_table;
經測試,在Kylin中讀取view沒問題,基礎表的增量更新,也會同步地反映到view中。至此,Kylin匯入複雜資料型別的Hive表問題已解決。此外,這篇文章《Kylin實踐之使用Hive檢視》介紹幾種不同場景下使用檢視的例子。
相關推薦
【Kylin實戰】Hive複雜資料型別與檢視
1. 引言 在分析廣告日誌時,會有這樣的多維分析需求: 曝光、點選使用者分別有多少? 標籤能覆蓋多少廣告使用者? 各個標籤(標註)類別能覆蓋的曝光、點選在各個DSP上所覆蓋的使用者數 …… 廣告資料與標籤資料join之後,儲存orc file的schema如下: create external table
【Flutter 實戰】大量複雜資料持久化
![](https://img2020.cnblogs.com/other/467322/202009/467322-20200924200424772-1691822451.png) > **老孟導讀**:上一篇文章講解了 Android 和 iOS 的檔案目錄系統,此篇文章講解如何使用 **SQL
【Java基礎】Java 基本資料型別
Java 的兩大資料型別: 內建資料型別 Java語言提供了八種基本型別。六種數字型別(四個整數型,兩個浮點型),一種字元型別,還有一種布林型。 byte: byte 資料型別是8位、有符號的,以二進位制補碼錶示的整數; 最小值是 -1
【Java-17】包裝類資料型別理解
字串類為String,實際上整型、浮點型等也有同String一樣類,也有類似String.valueOf類方法,也可以直接使用i.x如下: package baozhuang_class; public class Int { public static void main(String[
【Java-26】Java時間資料型別問題
Date類可以認為是時間資料型別,時間獲取與轉換見以下詳細程式碼 public class Time { public static void main(String[] args) throws ParseException { //直接獲取當前時間 Date time=new
【Kylin實戰】郵件報表生成
在cube build完成後,我的工作是寫sql生成資料分析郵件報表。但是,問題是這種重複勞動效率低、易出錯、浪費時間。還好Kylin提供RESTful API,可以將這種資料分析需求轉換成HTTP請求。 1. RESTful API Kylin的認證是basic authentication,加密演算法是B
【Redis學習】:set資料型別詳解
set資料結構 常用命令 新增/刪除元素 sadd key values[value1 value2 ...] 向set中新增資料,如果該key的值已有不會重複新增。 srem
【Redis學習】:list資料型別詳解
list資料結構 在redis中,list資料結構是按照插入順序的字串連結串列,和資料結構中的普通連結串列一樣,我們可以在其頭部(left)和尾部(right)新增新的元素。在插入時,如果該鍵並不
【統計學】【2017.05】時間序列資料預測與分析
本文為布拉格捷克理工大學(作者:Oleg Ostashchuk)的碩士論文,共78頁。 本文討論了時間序列分析和預測的問題。論文的目的是研究現有的時間序列預測方法,包括必要的資料預處理步驟。本文選取了ARIMA、人工神經網路和雙指數平滑三種有前景的預測方法。本文的主要工作是對所提供的資
【ElasticSearch實戰】——ES常用查詢條件與mysql對比
類比mysql,我們需要=、>、>=、<、<= 、or、and、in、like、count、sum、group by、order by、limit 在高版本的ES裡面使用了boolquery替換了filter 1、等於號= Quer
【Numpy使用】numpy中的副本與檢視
對於numpy中的array進行操作的時候,可以三種複製方式。 1.淺拷貝 2.檢視方式(view) 3.深拷貝(copy) 1.淺拷貝 直接進行賦值的方式,沒有新物件的構造,兩次建立的變數是指向相同的記憶體區域的。 import numpy as np a =
hive筆記:複雜資料型別-map結構
map 結構 1. 語法:map(k1,v1,k2,v2,…) 操作型別:map ,map型別的資料可以通過'列名['key']的方式訪問 案例: select deductions['Federal Taxes'],deductions['
【JavaScript】常用的資料型別的處理方式
寫這篇文章的目的,是在學習過程中反覆查詢如何對這三種資料型別進行轉換的方法,所以乾脆總結在一起。 一、字串 0.includes:string.includes(),查詢當前string中是否包含某個字串,有返回true,沒有返回false 1.indexOf:string.indexO
【 C 】經典抽象資料型別(ADT)之記憶體分配
C中的一些抽象資料型別(ADT)如連結串列、堆疊、佇列和樹等,連結串列已經在前幾篇博文有所討論,見: 後面的博文會相繼討論堆疊、佇列和樹的一些基本的相關知識! 下面記錄一個最基本的問題,記憶體分配問題: 所有的 ADT 都必須明確一個問題,如何獲取記憶體
《瘋狂Java講義(第4版)》-----第3章【資料型別與運算子】
Java的官方API下載 Java語言是一門強型別語言。強型別含義: 所有變數必須先宣告,後使用; 指定型別的變數只能接受型別與之匹配的值 註釋 //單行註釋 /* 多行註釋 */ /** *文件註釋 */ 識別符號 字母、下劃線、美元符號、數字組成。字
【C語言】typedef(自定義資料型別)與#define(巨集定義)用法比較
不管是在C語言還是在C++中,typedef這個詞都不少見,當然出現頻率較高的還是在C程式碼中。typedef和#define有些相似,但更多的是不同,特別是在一些複雜的用法上,就完全不同了。 1.巨集定義(#define) 巨集定義又稱為巨集代換
【NCNN原始碼分析】1.基本資料型別
對於NCNN而言,核心在於網路的前向推理過程(Inference),其主要資料型別為mat,該資料型別以類的形式定義在src/mat.h中,其中包含了mat的建構函式、解構函式、常見的運算過程。 #if
【專案實戰】:Python :視訊網站資料清洗整理和結論研究
視訊網站資料清洗整理和結論研究 要求: 1、資料清洗 - 去除空值 要求:建立函式 提示:fillna方法填充缺失資料,注意inplace引數 2、資料清洗 - 時間標籤轉化 要求: ① 將時間欄
Python學習【第4篇】:Python之可變資料型別與不可變資料型別 可變資料型別和不可變資料型別
可變資料型別和不可變資料型別 1.可變資料型別:在id不變的情況下,value可改變(列表和字典是可變型別,但是字典中的key值必須是不可變型別) 2.不可變資料型別:value改變,id也跟著改變。
Hive支援的資料型別!基本資料型別!!複雜資料型別!!
Hive支援的資料型別分為兩類,即基本資料型別和複雜資料型別. 基本資料型別包括數值型、布林型和字串型別, 複雜資料型別包括資料組(ARRAY)、對映(MAP)、結構體(STRUCT)和共同體(UNION). 其中,基礎資料型別包括:TINYINT,SMALLINT