hive相对于oracle的优点,【Hive】Hive面试题
1、hive的join有幾種方式,怎么實現(xiàn)join的?
left join
--以左表為基準,不符合的值以null值顯示
--工作中以left join 居多,大表加載小表的形式
select empno,ename,emp.deptno,dname from emp left join dept on
emp.deptno=dept.deptno;
right join
--以右表為基準,不符合的值以null值顯示
select empno,ename,emp.deptno,dept.deptno from emp right join
dept on emp.deptno=dept.deptno;
full join
select empno,ename,emp.deptno,dept.deptno from emp full join
dept on emp.deptno=dept.deptno;
===============================================
2、hive內(nèi)部表與外部表的區(qū)別
Hive
創(chuàng)建內(nèi)部表時,會將數(shù)據(jù)移動到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對數(shù)據(jù)的位置做任何改變。
在刪除表的時候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。這樣外部表相對來說更加安全些,數(shù)據(jù)組織也更加靈活,方便共享源數(shù)據(jù)。
1、在導(dǎo)入數(shù)據(jù)到外部表,數(shù)據(jù)并沒有移動到自己的數(shù)據(jù)倉庫目錄下,也就是說外部表中的數(shù)據(jù)并不是由它自己來管理的!而表則不一樣;
2、在刪除表的時候,Hive將會把屬于表的元數(shù)據(jù)和數(shù)據(jù)全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元數(shù)據(jù),數(shù)據(jù)是不會刪除的!
===========================================================
3、hive表關(guān)聯(lián)要注意什么,任意兩張表都可以關(guān)聯(lián)么?
===========================================================
4、hive是如何實現(xiàn)分區(qū)的?
Hive中的分區(qū)就是分目錄,把一個大的數(shù)據(jù)集根據(jù)業(yè)務(wù)需要分割成更小的數(shù)據(jù)集。
===========================================================
5、hive支持not in 么?
hive在0.13版本后已經(jīng)支持in和not in了!hive已經(jīng)越來越像我們平時使用的關(guān)系型數(shù)據(jù)庫了!
===============================================
6、 Hive有那些方式保存元數(shù)據(jù)的,各有那些特點。
1) 內(nèi)存數(shù)據(jù)庫derby,較小,不常用
2) 本地mysql,較常用
3) 遠程mysql,不常用
===============================================
7、hive如何優(yōu)化,列舉說明
hive查詢操作優(yōu)化
-------group by 優(yōu)化---------
set hive.groupby.skewindata=true 如果是group
by過程出現(xiàn)傾斜應(yīng)該設(shè)置為true;
set hive.groupby.mapaggr.checkintenval=1000000;
這個是group的鍵對應(yīng)的記錄條數(shù)超過這個值則會進行優(yōu)化
-----------join優(yōu)化-------------------
set
hive.optimize.skewjoin=true;如果是join過程出現(xiàn)傾斜 應(yīng)該設(shè)置為true
set
hive.skewjoin.key=1000000;--這個是join的鍵對應(yīng)的記錄條數(shù)超過這個值則會進行優(yōu)化
-----------mapjoin-----------------
當表小于25mb的時候,小表自動注入內(nèi)存
set hive.auto.convert.join=true;
set
hive.mapjoin.smalltable.filesize=25mb;?默認值是25mb
===========================================================
8、hive底層與數(shù)據(jù)庫交互原理
Hive的查詢功能是由hdfs + mapreduce結(jié)合起來實現(xiàn)的
Hive與mysql的關(guān)系:只是借用mysql來存儲hive中的表的元數(shù)據(jù)信息,稱為metastore
===========================================================
9、hive如何權(quán)限控制?
Hive從0.10版本(包含0.10版本)以后可以通過元數(shù)據(jù)來控制權(quán)限,Hive-0.10之前的版本對權(quán)限的控制主要是通過Linux的用戶和用戶組來控制,不能對Hive表的CREATE、SELECT、DROP等操作進行控制,當然Hive基于元數(shù)據(jù)來控制權(quán)限也不是完全安全的,目的就是為了防止用戶不小心做了不該做的操作
===========================================================
10、hive能像關(guān)系型數(shù)據(jù)庫那樣,建多個庫么?
===========================================================
11、hive中sort by和order by的區(qū)別?
使用order by會引發(fā)全局排序
使用distribute和sort進行分組排序
===========================================================
12、hive中的壓縮格式各有什么區(qū)別?
RCFile
RCFile是Hive推出的一種專門面向列的數(shù)據(jù)格式。
它遵循“先按列劃分,再垂直劃分”的設(shè)計理念。當查詢過程中,針對它并不關(guān)心的列時,它會在IO上跳過這些列。需要說明的是,RCFile在map階段從
遠端拷貝仍然是拷貝整個數(shù)據(jù)塊,并且拷貝到本地目錄后RCFile并不是真正直接跳過不需要的列,并跳到需要讀取的列,
而是通過掃描每一個row group的頭部定義來實現(xiàn)的,但是在整個HDFS Block 級別的頭部并沒有定義每個列從哪個row
group起始到哪個row
group結(jié)束。所以在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。
TextFile:
Hive默認格式,數(shù)據(jù)不做壓縮,磁盤開銷大,數(shù)據(jù)解析開銷大。
可結(jié)合Gzip、Bzip2、Snappy等使用(系統(tǒng)自動檢查,執(zhí)行查詢時自動解壓),但使用這種方式,hive不會對數(shù)據(jù)進行切分,從而無法對數(shù)據(jù)進行并行操作。
SequenceFile:
SequenceFile是Hadoop API
提供的一種二進制文件,它將數(shù)據(jù)以的形式序列化到文件中。這種二進制文件內(nèi)部使用Hadoop 的標準的Writable
接口實現(xiàn)序列化和反序列化。它與Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile
繼承自Hadoop API 的SequenceFile,不過它的key為空,使用value 存放實際的值, 這樣是為了避免MR
在運行map 階段的排序過程
===========================================================
13、hive的兩張表關(guān)聯(lián),使用mapreduce是怎么寫的?
===========================================================
14、hive相對于Oracle來說有哪些優(yōu)點?
hive 是數(shù)據(jù)倉庫,oracle是數(shù)據(jù)庫,hive
能夠存儲海量數(shù)據(jù),hive還有更重要的作用就是數(shù)據(jù)分析,最主要的是免費。
1
hive表關(guān)聯(lián)查詢,如何解決數(shù)據(jù)傾斜的問題?
傾斜原因:
map輸出數(shù)據(jù)按key
Hash的分配到reduce中,由于key分布不均勻、業(yè)務(wù)數(shù)據(jù)本身的特、建表時考慮不周、等原因造成的reduce
上的數(shù)據(jù)量差異過大。
1)、key分布不均勻;
2)、業(yè)務(wù)數(shù)據(jù)本身的特性;
3)、建表時考慮不周;
4)、某些SQL語句本身就有數(shù)據(jù)傾斜;
如何避免:對于key為空產(chǎn)生的數(shù)據(jù)傾斜,可以對其賦予一個隨機值。
解決方案
1>.參數(shù)調(diào)節(jié):
hive.map.aggr = true
hive.groupby.skewindata=true
有數(shù)據(jù)傾斜的時候進行負載均衡,當選項設(shè)定位true,生成的查詢計劃會有兩個MR Job。第一個MR
Job中,Map的輸出結(jié)果集合會隨機分布到Reduce中,每個Reduce做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的Group
By Key有可能被分發(fā)到不同的Reduce中,從而達到負載均衡的目的;第二個MR Job再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照Group By
Key 分布到 Reduce 中(這個過程可以保證相同的 Group By Key
被分布到同一個Reduce中),最后完成最終的聚合操作。
2>.SQL 語句調(diào)節(jié):
1)、選用join key分布最均勻的表作為驅(qū)動表。做好列裁剪和filter操作,以達到兩表做join
的時候,數(shù)據(jù)量相對變小的效果。
2)、大小表Join:
使用map join讓小的維度表(1000 條以下的記錄條數(shù))先進內(nèi)存。在map端完成reduce.
4)、大表Join大表:
把空值的key變成一個字符串加上隨機數(shù),把傾斜的數(shù)據(jù)分到不同的reduce上,由于null
值關(guān)聯(lián)不上,處理后并不影響最終結(jié)果。
5)、count distinct大量相同特殊值:
count distinct 時,將值為空的情況單獨處理,如果是計算count
distinct,可以不用處理,直接過濾,在最后結(jié)果中加1。如果還有其他計算,需要進行g(shù)roup
by,可以先將值為空的記錄單獨處理,再和其他計算結(jié)果進行union。
2.
請談一下hive的特點是什么?hive和RDBMS有什么異同?
hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供完整的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進行運行。其優(yōu)點是學習成本低,可以通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計,不必開發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。
3. 請把下一語句用hive方式實現(xiàn)?
SELECT a.key,a.value
FROM a
WHERE a.key not in (SELECT b.key FROM b)
答案:
select a.key,a.value from a where a.key not exists (select b.key
from b)
4. Multi-group by
是hive的一個非常好的特性,請舉例說明
from A
insert overwrite table B
select A.a, count(distinct A.b) group by A.a
insert overwrite table C
select A.c, count(distinct A.b) group by A.c
5. 請說明hive中 Sort By,Order By,Cluster
By,Distrbute By各代表什么意思。
order
by:會對輸入做全局排序,因此只有一個reducer(多個reducer無法保證全局有序)。只有一個reducer,會導(dǎo)致當輸入規(guī)模較大時,需要較長的計算時間。
sort by:不是全局排序,其在數(shù)據(jù)進入reducer前完成排序。
distribute by:按照指定的字段對數(shù)據(jù)進行劃分輸出到不同的reduce中。
cluster by:除了具有 distribute by 的功能外還兼具 sort by 的功能。
6.簡要描述數(shù)據(jù)庫中的
null,說出null在hive底層如何存儲,并解釋selecta.* from t1 a left outer join t2 b
on a.id=b.id where b.id is null; 語句的含義
null與任何值運算的結(jié)果都是null, 可以使用is null、is not null函數(shù)指定在其值為null情況下的取值。
null在hive底層默認是用'\N'來存儲的,可以通過alter table test SET
SERDEPROPERTIES('serialization.null.format' = 'a');來修改。
查詢出t1表中與t2表中id相等的所有信息。
7.寫出hive中split、coalesce及collect_list函數(shù)的用法(可舉例)。
Split將字符串轉(zhuǎn)化為數(shù)組。
split('a,b,c,d' , ',') ==> ["a","b","c","d"]
COALESCE(T v1, T v2, …) 返回參數(shù)中的第一個非空值;如果所有值都為 NULL,那么返回NULL。
collect_list列出該字段所有的值,不去重?select collect_list(id)
from table;
8.寫出將 text.txt 文件放入 hive 中 test
表‘2016-10-10’ 分區(qū)的語句,test 的分區(qū)字段是 l_date。
LOAD DATA LOCAL INPATH '/your/path/test.txt' OVERWRITE INTO TABLE
test PARTITION (l_date='2016-10-10')
總結(jié)
以上是生活随笔為你收集整理的hive相对于oracle的优点,【Hive】Hive面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 替换 乱码,php文字替换出现乱
- 下一篇: oracle原始数据类型,Oracle基