1. 程式人生 > >【Kylin實戰】Hive複雜資料型別與檢視

【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-26Java時間資料型別問題

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