日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Hive---DDL

發(fā)布時(shí)間:2024/1/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hive---DDL 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 1.hive數(shù)據(jù)類(lèi)型
          • 1.1 原生數(shù)據(jù)類(lèi)型
          • 1.2 復(fù)雜數(shù)據(jù)類(lèi)型
          • 1.3 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
      • 2.Hive讀寫(xiě)機(jī)制
          • 2.1 SerDe
          • 2.2 hive讀取文件機(jī)制
          • 2.3 hive寫(xiě)文件機(jī)制
          • 2.4 SerDe語(yǔ)法
      • 3.Hive存儲(chǔ)路徑
          • 3.1 指定存儲(chǔ)路徑
      • 4.Hive建表高階
          • 4.1 hive內(nèi)部表、外部表
          • 4.2 分區(qū)表
            • 4.2.1 靜態(tài)分區(qū)
            • 4.2.2 動(dòng)態(tài)分區(qū)
            • 4.2.3 分區(qū)表的注意事項(xiàng)
            • 4.2.4 多重分區(qū)
          • 4.3 分桶表
            • 4.3.1 分桶表的語(yǔ)法
            • 4.3.2 分桶表的數(shù)據(jù)加載
            • 4.3.3 分桶表的好處
          • 4.4 事務(wù)表
            • 4.4.1 操作事務(wù)表
          • 4.5 Hive View
            • 4.5.1 操作視圖
            • 4.5.2 視圖的優(yōu)點(diǎn)
          • 4.6 物化視圖
            • 4.6.1 物化視圖和視圖的區(qū)別
            • 4.6.2 語(yǔ)法
            • 4.6.3 基于物化視圖的查詢(xún)重寫(xiě)

1.hive數(shù)據(jù)類(lèi)型

hive的數(shù)據(jù)類(lèi)型分為兩種:
1.原生數(shù)據(jù)類(lèi)型:數(shù)值類(lèi)型、時(shí)間類(lèi)型、字符串類(lèi)型、雜項(xiàng)數(shù)據(jù)類(lèi)型。
2.復(fù)雜數(shù)據(jù)類(lèi)型:array數(shù)組、map映射、struct結(jié)構(gòu)、union聯(lián)合體。

1.1 原生數(shù)據(jù)類(lèi)型

1.2 復(fù)雜數(shù)據(jù)類(lèi)型

1.3 數(shù)據(jù)類(lèi)型轉(zhuǎn)換

HQL支持隱式和顯示轉(zhuǎn)換,原生類(lèi)型從窄類(lèi)型到寬類(lèi)型的轉(zhuǎn)換稱(chēng)為隱式轉(zhuǎn)換,反之,則不允許。
下表描述了類(lèi)型之間允許的隱式轉(zhuǎn)換:

2.Hive讀寫(xiě)機(jī)制

2.1 SerDe

SerDe是Serializer、DeSerializer的簡(jiǎn)稱(chēng),目的是用于序列化和反序列化。序列化是將對(duì)象轉(zhuǎn)化為字節(jié)碼的過(guò)程,序列化是將字節(jié)碼轉(zhuǎn)化為對(duì)象的過(guò)程。

2.2 hive讀取文件機(jī)制

首先調(diào)用InputFileFormat(在hdfs中默認(rèn)為T(mén)extInputFormat按行讀取),返回一條條kv鍵值對(duì)記錄,然后調(diào)用SerDe的Deserializer將字節(jié)序列轉(zhuǎn)換為對(duì)象,然后將一條記錄中的value根據(jù)分隔符切分為各個(gè)字段。

2.3 hive寫(xiě)文件機(jī)制

將行寫(xiě)入文件時(shí),首先調(diào)用serde的Serializer將對(duì)象轉(zhuǎn)換為字節(jié)序列,然后調(diào)用OutputFileFormat將數(shù)據(jù)寫(xiě)入HDFS文件。

2.4 SerDe語(yǔ)法

LazySimpleSerDe是Hive默認(rèn)的序列化類(lèi),包含四種子語(yǔ)法,分別用于指定字段之間、集合元素之間、Map映射kv之間、換行之間的分隔符符號(hào)。如

row format delimited fileds terminated by ',';

字段之間默認(rèn)的分隔符是’\001’,是一種特殊的字符,使用的是ascii編碼的值,鍵盤(pán)無(wú)法打出。

3.Hive存儲(chǔ)路徑

Hive表默認(rèn)存儲(chǔ)路徑默認(rèn)值為/user/hive/warehouse

3.1 指定存儲(chǔ)路徑

在hive建表的時(shí)候,可以通過(guò)location語(yǔ)法來(lái)更改數(shù)據(jù)在HDFS上的路徑,使得建表加載數(shù)據(jù)更加靈活。

4.Hive建表高階

4.1 hive內(nèi)部表、外部表

內(nèi)部表(Internal table)也稱(chēng)為被Hive擁有和管理的托管表(Managed table)。默認(rèn)情況下創(chuàng)建的表就是內(nèi)部表,Hive擁有該表的結(jié)構(gòu)和文件。換句話說(shuō),Hive完全管理表(元數(shù)據(jù)和數(shù)據(jù))的生命周期,類(lèi)似于RDBMS中的表。當(dāng)您刪除內(nèi)部表時(shí),它會(huì)刪除數(shù)據(jù)以及表的元數(shù)據(jù)。

外部表(External table)中的數(shù)據(jù)不是Hive擁有或管理的,只管理表元數(shù)據(jù)的生命周期。要?jiǎng)?chuàng)建一個(gè)外部表,需要使用EXTERNAL語(yǔ)法關(guān)鍵字。刪除外部表只會(huì)刪除元數(shù)據(jù),而不會(huì)刪除實(shí)際數(shù)據(jù)。在Hive外部仍然可以訪問(wèn)實(shí)際數(shù)據(jù)。而且外部表更為方便的是可以搭配location語(yǔ)法指定數(shù)據(jù)的路徑。
外部表創(chuàng)建:使用external進(jìn)行修飾

create external table student_ext(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ',' location '/stu';

4.2 分區(qū)表

現(xiàn)有一張表t_all_hero,同時(shí)映射加載了六份數(shù)據(jù)文件(分別記錄了王者榮耀中六種位置的英雄的相關(guān)信息)。
如果不對(duì)表進(jìn)行分區(qū),那么在執(zhí)行查詢(xún)的時(shí)候,會(huì)對(duì)全表進(jìn)行檢索才能得出相應(yīng)的結(jié)果,如果數(shù)據(jù)文件很多的話,則會(huì)大大降低查詢(xún)效率,此時(shí)可以通過(guò)對(duì)表進(jìn)行分區(qū),避免查詢(xún)時(shí)候全表掃描數(shù)據(jù),極大的提升了查詢(xún)效率。此外,hive支持根據(jù)用戶指定的字段進(jìn)行分區(qū)。

分區(qū)建表語(yǔ)法:

CREATE TABLE table_name (column1 data_type, column2 data_type) PARTITIONED BY (partition1 data_type, partition2 data_type,….);
4.2.1 靜態(tài)分區(qū)

靜態(tài)分區(qū):指的是分區(qū)的字段值是由用戶在加載數(shù)據(jù)的時(shí)候手動(dòng)指定的。
語(yǔ)法如下:

load data [local] inpath ' ' into table tablename partition(分區(qū)字段='分區(qū)值'...); eg: load data local inpath '/root/hivedata/archer.txt' into table t_all_hero_part partition(role='sheshou'); load data local inpath '/root/hivedata/assassin.txt' into table t_all_hero_part partition(role='cike');
4.2.2 動(dòng)態(tài)分區(qū)

向分區(qū)表中加載數(shù)據(jù)時(shí),如果需要?jiǎng)?chuàng)建的分區(qū)很多,則會(huì)復(fù)制修改很多sql去執(zhí)行,效率低。因?yàn)閔ive是批處理系統(tǒng),所以hive提供了一個(gè)動(dòng)態(tài)分區(qū)功能,即根據(jù)查詢(xún)參數(shù)的位置去推斷分區(qū)的名稱(chēng),從而建立分區(qū)
動(dòng)態(tài)分區(qū):分區(qū)的字段值是根據(jù)查詢(xún)結(jié)果自動(dòng)推斷出來(lái)的。
啟動(dòng)hive分區(qū)之前,需要在hive會(huì)話中設(shè)置兩個(gè)參數(shù):

//開(kāi)啟動(dòng)態(tài)分區(qū)功能 set hive.exec.dynamic.partition=true; //指定動(dòng)態(tài)分區(qū)的模式,nonstrict為非嚴(yán)格模式和strict嚴(yán)格模式 set hive.exec.dynamic.partition.mode=nonstrict;

嚴(yán)格模式要求至少有一個(gè)分區(qū)為靜態(tài)分區(qū)

案例:

//創(chuàng)建一張新的分區(qū)表t_all_hero_part_dynamic create table t_all_hero_part_dynamic(id int,name string,hp_max int,mp_max int,attack_max int,defense_max int,attack_range string,role_main string,role_assist string ) partitioned by (role string) row format delimited fields terminated by "\t"; //執(zhí)行動(dòng)態(tài)分區(qū)插入,tmp.*表示插入的總數(shù)據(jù),tmp.role_main表示分區(qū)值,即查詢(xún)參數(shù)的位置 insert into table t_all_hero_part_dynamic partition(role) select tmp.*,tmp.role_main from t_all_hero tmp;

注意:tmp.*和tmp.role_main位置不可顛倒

4.2.3 分區(qū)表的注意事項(xiàng)

一、 分區(qū)表不是建表的必要語(yǔ)法規(guī)則,是一種優(yōu)化手段表,可選;
二、 分區(qū)字段不能是表中已有的字段,不能重復(fù);
三、 分區(qū)字段是虛擬字段,其數(shù)據(jù)并不存儲(chǔ)在底層的文件中;
四、 分區(qū)字段值的確定來(lái)自于用戶價(jià)值數(shù)據(jù)手動(dòng)指定(靜態(tài)分區(qū))或者根據(jù)查詢(xún)結(jié)果位置自動(dòng)推斷(動(dòng)態(tài)分區(qū))
五、 Hive支持多重分區(qū),也就是說(shuō)在分區(qū)的基礎(chǔ)上繼續(xù)分區(qū),劃分更加細(xì)粒度

4.2.4 多重分區(qū)

多重分區(qū)下,分區(qū)之間是一種遞進(jìn)關(guān)系,可以理解為在前一個(gè)分區(qū)的基礎(chǔ)上繼續(xù)分區(qū)。從HDFS的角度來(lái)看就是文件夾下繼續(xù)劃分子文件夾。比如:把全國(guó)人口數(shù)據(jù)首先根據(jù)省進(jìn)行分區(qū),然后根據(jù)市進(jìn)行劃分,如果你需要甚至可以繼續(xù)根據(jù)區(qū)縣再劃分,此時(shí)就是3分區(qū)表。

//雙分區(qū)表,按省份和市分區(qū) create table t_user_province_city (id int, name string, age int) partitioned by (province string, city string);load data local inpath '文件路徑' into table t_user_province_city partition(province='zhejiang',city='hangzhou');
4.3 分桶表

分桶表也叫做桶表,源自建表語(yǔ)法中bucket單詞。是一種用于優(yōu)化查詢(xún)而設(shè)計(jì)的表類(lèi)型。該功能可以讓數(shù)據(jù)分解為若干個(gè)部分易于管理。
在分桶時(shí),我們要指定根據(jù)哪個(gè)字段將數(shù)據(jù)分為幾桶(幾個(gè)部分)。默認(rèn)規(guī)則是:Bucket number = hash_function(bucketing_column) mod num_buckets。
可以發(fā)現(xiàn)桶編號(hào)相同的數(shù)據(jù)會(huì)被分到同一個(gè)桶當(dāng)中。hash_function取決于分桶字段bucketing_column的類(lèi)型:
如果是int類(lèi)型,hash_function(int) == int;
如果是其他類(lèi)型,比如bigint,string或者復(fù)雜數(shù)據(jù)類(lèi)型,hash_function比較棘手,將是從該類(lèi)型派生的某個(gè)數(shù)字,比如hashcode值。

4.3.1 分桶表的語(yǔ)法
CREATE [EXTERNAL] TABLE [db_name.]table_name [(col_name data_type, ...)] CLUSTERED BY (col_name) INTO N BUCKETS;

其中CLUSTERED BY (col_name)表示根據(jù)哪個(gè)字段進(jìn)行分;INTO N BUCKETS表示分為幾桶(也就是幾個(gè)部分)。需要注意的是,分桶的字段必須是表中已經(jīng)存在的字段。

4.3.2 分桶表的數(shù)據(jù)加載
//開(kāi)啟分桶的功能 從Hive2.0開(kāi)始不再需要設(shè)置 set hive.enforce.bucketing=true;//把源數(shù)據(jù)加載到普通hive表中 CREATE TABLE itcast.t_usa_covid19(count_date string,county string,state string,fips int,cases int,deaths int) row format delimited fields terminated by ","; //將源數(shù)據(jù)上傳到HDFS,t_usa_covid19表對(duì)應(yīng)的路徑下 hadoop fs -put us-covid19-counties.dat /user/hive/warehouse/itcast.db/t_usa_covid19//使用insert+select語(yǔ)法將數(shù)據(jù)加載到分桶表中 insert into t_usa_covid19_bucket select * from t_usa_covid19;

分桶表將數(shù)據(jù)分為了五個(gè)部分:

4.3.3 分桶表的好處

1、基于分桶字段查詢(xún)時(shí),減少全表掃描
2、JOIN時(shí)可以提高M(jìn)R程序效率,減少笛卡爾積數(shù)量
3、分桶表數(shù)據(jù)進(jìn)行抽樣

4.4 事務(wù)表

hive中通過(guò)事務(wù)解決以下問(wèn)題:
1.流式傳輸數(shù)據(jù)
使用如Apache Flume或Apache Kafka之類(lèi)的工具將數(shù)據(jù)流式傳輸?shù)紿adoop集群中。雖然這些工具可以每秒數(shù)百行或更多行的速度寫(xiě)入數(shù)據(jù),但是Hive只能每隔15分鐘到一個(gè)小時(shí)添加一次分區(qū)。頻繁添加分區(qū)會(huì)很快導(dǎo)致表中大量的分區(qū)。因此通常使用這些工具將數(shù)據(jù)流式傳輸?shù)浆F(xiàn)有分區(qū)中,但是這會(huì)使讀者感到臟讀(也就是說(shuō),他們將在開(kāi)始查詢(xún)后看到寫(xiě)入的數(shù)據(jù)),并將許多小文件留在目錄中,這將給NameNode帶來(lái)壓力。通過(guò)事務(wù)功能,同時(shí)允許讀者獲得一致的數(shù)據(jù)視圖并避免過(guò)多的文件。
2.尺寸變化緩慢(例如:表結(jié)構(gòu)變化)
在典型的星型模式數(shù)據(jù)倉(cāng)庫(kù)中,維度表隨時(shí)間緩慢變化。例如,零售商將開(kāi)設(shè)新商店,需要將其添加到商店表中,或者現(xiàn)有商店可能會(huì)更改其平方英尺或某些其他跟蹤的特征。這些更改導(dǎo)致插入單個(gè)記錄或更新 記錄(取決于所選策略)。
3.數(shù)據(jù)重述
有時(shí)發(fā)現(xiàn)收集的數(shù)據(jù)不正確,需要更正。從Hive 0.14開(kāi)始,可以通過(guò)INSERT,UPDATE和 DELETE支持這些用例 。

hive中的事務(wù)的限制:
? 尚不支持BEGIN,COMMIT和ROLLBACK。所有語(yǔ)言操作都是自動(dòng)提交的。
? 僅支持ORC文件格式(STORED AS ORC)。
? 默認(rèn)情況下事務(wù)配置為關(guān)閉。需要配置參數(shù)開(kāi)啟使用。
? 表必須是分桶表(Bucketed)才可以使用事務(wù)功能。
? 表參數(shù)transactional必須為true;
? 外部表不能成為ACID表,不允許從非ACID會(huì)話讀取/寫(xiě)入ACID表。

4.4.1 操作事務(wù)表
--Hive中事務(wù)表的創(chuàng)建使用 --1、開(kāi)啟事務(wù)配置(可以使用set設(shè)置當(dāng)前session生效 也可以配置在hive-site.xml中) set hive.support.concurrency = true; --Hive是否支持并發(fā) set hive.enforce.bucketing = true; --從Hive2.0開(kāi)始不再需要 是否開(kāi)啟分桶功能 set hive.exec.dynamic.partition.mode = nonstrict; --動(dòng)態(tài)分區(qū)模式 非嚴(yán)格 set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; -- set hive.compactor.initiator.on = true; --是否在Metastore實(shí)例上運(yùn)行啟動(dòng)線程和清理線程 set hive.compactor.worker.threads = 1; --在此metastore實(shí)例上運(yùn)行多少個(gè)壓縮程序工作線程。--2、創(chuàng)建Hive事務(wù)表 create table trans_student(id int,name String,age int )clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');--3、針對(duì)事務(wù)表進(jìn)行insert update delete操作 insert into trans_student (id, name, age) values (1,"allen",18);update trans_student set age = 20 where id = 1;delete from trans_student where id =1;//查詢(xún)事務(wù)表 select * from trans_student;
4.5 Hive View

Hive中的視圖(view)是一種虛擬表,只保存定義,不實(shí)際存儲(chǔ)數(shù)據(jù)。通常從真實(shí)的物理表查詢(xún)中創(chuàng)建生成視圖,也可以從已經(jīng)存在的視圖上創(chuàng)建新視圖。
創(chuàng)建視圖時(shí),將凍結(jié)視圖的架構(gòu),如果刪除或更改基礎(chǔ)表,則視圖將失敗,并且視圖不能存儲(chǔ)數(shù)據(jù),操作數(shù)據(jù),只能查詢(xún)。

4.5.1 操作視圖
--hive中有一張真實(shí)的基礎(chǔ)表t_usa_covid19 select * from itcast.t_usa_covid19;--1、創(chuàng)建視圖 create view v_usa_covid19 as select count_date, county,state,deaths from t_usa_covid19 limit 5;--能否從已有的視圖中創(chuàng)建視圖呢 可以的 create view v_usa_covid19_from_view as select * from v_usa_covid19 limit 2;--2、顯示當(dāng)前已有的視圖 show tables; show views;--hive v2.2.0之后支持--3、視圖的查詢(xún)使用 select * from v_usa_covid19;--能否插入數(shù)據(jù)到視圖中呢? --不行 報(bào)錯(cuò) SemanticException:A view cannot be used as target table for LOAD or INSERT insert into v_usa_covid19 select count_date,county,state,deaths from t_usa_covid19;--4、查看視圖定義 show create table v_usa_covid19;--5、刪除視圖 drop view v_usa_covid19_from_view; --6、更改視圖屬性 alter view v_usa_covid19 set TBLPROPERTIES ('comment' = 'This is a view'); --7、更改視圖定義 alter view v_usa_covid19 as select county,deaths from t_usa_covid19 limit 2;
4.5.2 視圖的優(yōu)點(diǎn)

1.提高數(shù)據(jù)的安全性,只將特定列的數(shù)據(jù)展示給用戶
2.降低查詢(xún)的復(fù)雜度,優(yōu)化查詢(xún)語(yǔ)句

4.6 物化視圖

在傳統(tǒng)的數(shù)據(jù)庫(kù)領(lǐng)域基本已經(jīng)都實(shí)現(xiàn)了物化視圖, 屬于數(shù)據(jù)庫(kù)的高級(jí)功能。物化視圖(Materialized View)是一個(gè)包括查詢(xún)結(jié)果的數(shù)據(jù)庫(kù)對(duì)像,可以用于預(yù)先計(jì)算并保存表連接或聚集等耗時(shí)較多的操作的結(jié)果。這樣,在執(zhí)行查詢(xún)時(shí),就可以避免進(jìn)行這些耗時(shí)的操作,而從快速的得到結(jié)果。

4.6.1 物化視圖和視圖的區(qū)別

視圖是虛擬的,邏輯存在的,只有定義沒(méi)有存儲(chǔ)數(shù)據(jù)。
物化視圖是真實(shí)的,物理存在的,里面存儲(chǔ)著預(yù)計(jì)算的數(shù)據(jù)。
視圖的目的是簡(jiǎn)化降低查詢(xún)的復(fù)雜度,而物化視圖的目的是提高查詢(xún)性能。

4.6.2 語(yǔ)法
--物化視圖的創(chuàng)建語(yǔ)法 CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name[DISABLE REWRITE][COMMENT materialized_view_comment][PARTITIONED ON (col_name, ...)][CLUSTERED ON (col_name, ...) | DISTRIBUTED ON (col_name, ...) SORTED ON (col_name, ...)][[ROW FORMAT row_format][STORED AS file_format]| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)] AS SELECT ...;
4.6.3 基于物化視圖的查詢(xún)重寫(xiě)

物化視圖創(chuàng)建后即可用于相關(guān)查詢(xún)的加速,用戶提交查詢(xún)query,若該query經(jīng)過(guò)重寫(xiě)后可命中已建視圖,則被重寫(xiě)命中相關(guān)已建視圖實(shí)現(xiàn)查詢(xún)加速。
是否重寫(xiě)查詢(xún)使用物化視圖可以通過(guò)全局參數(shù)控制,默認(rèn)為true:

SET hive.materializedview.rewriting=true;

用戶可選擇性的失能物化視圖的重寫(xiě):

ALTER MATERIALIZED VIEW [db_name.]materialized_view_name ENABLE|DISABLE REWRITE;

總結(jié)

以上是生活随笔為你收集整理的Hive---DDL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。