Review Hive 知識點


>## 什麼是Hive?


>>Hive是基於Hadoop的一個數據倉庫工具,用來進行數據提取、轉化、加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。Hive數據倉庫工具能將結構化的數據文件映射爲一張數據庫表,並提供SQL查詢功能,能將SQL語句轉變成MapReduce任務來執行。
>


>## Hive的意義(最初研發的原因)?


>>降低程序員使用Hadoop的難度,降低學習成本


>## Hive的內部組成模塊,作用分別是什麼?


>>元數據:描述數據的數據
>>內部執行流程:
>>解析器(解析器SQL語句)、編譯器(把SQL語句編譯成MapReduce程序)、優化器(優化MapRedue程序)、執行器(將MapReduce程序運行的結果提交到HDFS)


>## Hive支持的數據格式?


>>TextFile、SequenceFile、RCFile、Parquet


>## 進入Hiveshell窗口的方式?


>>1、Hive命令直接進入HiveShell
>>2、HiveJDBC方式使用beeline連接hiveserver2
>>3、使用Hive命令參數直接執行hql語句


>## Hive數據庫、表在HDFS上存儲的路徑是什麼?


>>是由hive.site.xml當中的”hive,metastore.warehouse.dir“指定,默認在HDFS系統的 /user/hive/warehouse/ 文件夾下


>## like與rlike的區別?


>>like:like的內容不是正則,而是通配符(模糊匹配查詢)
>>rlike:rlike的內容可以是正則,正則的寫法與java一樣。


>## 內部表與外部表的區別?


>>未被external修飾的是內部表(managed table),被external修飾的爲外部表(external table);
>>區別:
>>1、內部表數據由Hive自身管理,外部表數據由HDFS管理;
>>2、內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse),外部表數據的存儲位置由自己制定(如果沒有LOCATION,Hive將在HDFS上的/user/hive/warehouse文件夾下以外部表的表名創建一個文件夾,並將屬於這個表的數據存放在這裏);
>>3、刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除;
>>4、對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)

 


>## 分區表的優點是,分區字段的要求是?


>>優點:
>>1、可以減少數據冗餘
>>2、提高指定分區查詢分析的效率
>>分區字段絕對不能出現在數據表以有的字段中。


>## 分桶表的優點是,分桶字段的要求是?


>>優點:獲得了更高的查詢處理效率,桶爲表加上了額外的結構,Hive在處理有些查詢時,能利用這個結構
>>分桶字段必須是表中的字段

 


>## 數據導入表的方式?


>>1、load加載數據
>>(linux) load data local inpath '/export/servers/hivedatas/score.csv' overwrite into table score partition(month='201806');
>>(HDFS) load data inpath '/export/servers/hivedatas/score.csv' overwrite into table score partition(month='201806');


>>2、直接向分區表中插入數據
>>insert into table score3 partition(month ='201807') values ('001','002','100');


>>3、多插入模式
>>from score
>>insert overwrite table score_first partition(month='201806') >select s_id,c_id
>>insert overwrite table score_second partition(month = >'201806') select c_id,s_score;


>>4、查詢語句中創建表並加載數據(as select)
>>create table tbname2 as select * from tbname1;


>>5、創建表時通過location指定加載數據路徑
>> create external table score6 (s_id string,c_id string,s_score int) row format delimited fields terminated by '\t' location '/myscore6'; 


>


>## 數據導出表的方式?


>>1、將查詢的結果導出到本地
>> insert overwrite local directory '/export/servers/exporthive/a' select * from score;


>>2、將查詢的結果格式化導出到本地
>> insert overwrite local directory '/export/servers/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from student;


>>3、將查詢的結果導出到HDFS上(沒有local)
>>insert overwrite directory '/export/servers/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from score;


>>4、Hadoop命令導出到本地
>> dfs -get /export/servers/exporthive/000000_0 /export/servers/exporthive/local.txt;


>>5 、 hive shell 命令導出
>>bin/hive -e "select * from yhive.score;" > /export/servers/exporthive/score.txt 


>>6、export導出到HDFS上(全表導出)
>> export table score to '/export/exporthive/score';


>> 7、SQOOP導出

 


>## order by與sort by的區別?


>>order by:全局排序,一個MapReduce
>>sort by:每個MapReduce內部進行排序,對全局結果集來說不是排序。


>## where 與having的區別?


>>where 作用在 分組(group by)和聚集(sum等)計算之前
>>having作用在 分組(group by)之後,對分組後計算的數據進行過濾


>## distribute by何時使用,通常與哪個聯合使用?


>>當需要根據某個字段進行分區時使用
>>通常與sort by結合使用(先分區後排序)
>>Hive要求DISTRIBUTE BY語句要寫在SORT BY語句之前。


>## Cluster by何時使用?


>>需要按照某個字段分區同時也按照這個字段進行排序時使用cluster by

 


>## distribute by+sort by(相同字段) 與Cluster by的區別?


>>distribute by+sort by:當distribute by和sort by字段相同時,就等價於cluster by,可以指定排序規則ASC或DESC。
>>cluster by:除了具有distribute by的功能外還兼具sort by的功能。但是排序只能是正序排序,不能指定排序規則爲ASC或者DESC。

 


>## hive -e/-f/-hiveconf分別是什麼意思?


>>-e:從命令行執行指定的 HQL
>>-f:執行 HQL 腳本
>>-hiveconf:hive相關配置屬性

 


>## hive聲明參數有哪些方式,優先級是什麼?


>>參數聲明 > 命令行參數 > 配置文件參數

 


>## 編寫hiveUDF代碼,方法名稱叫什麼?


>>evaluate()
>


>## hive常用的數據存儲格式是什麼?常用的數據壓縮格式是什麼?


>>常用的數據存儲格式是:ParquetFile、ORC
>>常用的數據壓縮格式是:Snappy

 


>## hive自定義函數的類型?


>>1、UDF(User-Defined-Function)
>>一進一出
>>2、UDAF(User-Defined Aggregation Function)
>>聚合函數,多進一處
>>3、UDTF(User-Defined Table-Generating Functions)
>>一進多出
>

 


>## Fetch抓取中設置more有什麼效果,設置none有什麼效果


>>簡單的查詢語句不會轉化成爲MR程序
>>設置爲後所有查詢語句都要轉化成爲MR程序

 


>## 本地模式有什麼好處


>>在小數據量的前提下 提高了查詢效率

 


>## 當一個key數據過大導致數據傾斜時,如何處理


>>開啓Map端聚合和功能開啓局部聚合後 hive會創建兩個MR 程序 第一個進行數據的局部聚合 第二個進行數據的最終彙總

 


>## Count(distinct) 的替換語句如何編寫


>>先去重,再求總數量
>>SELECT count(DISTINCT id) FROM bigtable;
>>替換方案
>>SELECT count(id) FROM (SELECT id FROM bigtable GROUP BY id) a;

 


>## 如何使用分區剪裁、列剪裁


>>列剪裁: 只拿需要的列
>>分區剪裁:只拿需要的分區 
>>要什麼 拿什麼

 


>## 如何理解動態分區調整


>>以第一個表的分區規則,來對應第二個表的分區規則,將第一個表的所有分區,全部拷貝到第二個表中來,第二個表在加載數據的時候,不需要指定分區了,直接用第一個表的分區即可

 


>## 數據傾斜時,如何將衆多數據寫入10個文件


>>衆人拾柴火焰高(將一個大的任務拆分成多個小任務,再次執行)
>>設置reduce數量10
>>1:distribute by (字段)
>>2 distribute by rand()
>

 


>## 影響map數量的因素


>>文件很小時候:影響map數量的因素是文件數量
>>文件很大時候:影響map數量的因素是塊的數量
>


>
>## reduce數量的計算是什麼


>>公式:
>>N=min(參數2,總輸入數據量/參數1)
>>參數1:每個Reduce處理的數據量
>>參數2:每個任務最大Reduce數量


>
>## 並行執行有什麼好處


>>並行執行使得多個沒有依賴關係的任務同時執行,起到了提高查詢效率的作用

 


>## 嚴格模式不能執行哪些命令


>>1、不允許掃描所有分區
>>2、使用了order by語句查詢,要求必須使用limit語句
>>3、限制笛卡爾積的查詢

 


>## JVM重用有什麼好處


>>允許多個task使用一個jvm
>>降低了任務啓動的開銷,提高了任務的執行效率
>>但是,在整個任務結束前,jvm不釋放,長時間佔用。導致資源不足時,資源浪費
>

 


>## 什麼是MR本地模式


>>數據存儲到HDFS後,編寫分析代碼實現計算程序,程序在進行分發時,優先分發放到這個程序所使用到的數據所在的節點上。
>

 


>## 先join後過濾的優化方案


>>1、SELECT a.id FROM ori a LEFT JOIN bigtable b
>>ON (b.id <= 10 AND a.id = b.id);
>>2、SELECT a.id FROM bigtable a RIGHT JOIN (SELECT id FROM ori WHERE id <= 10 ) b ON a.id = b.id;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章