Hive技能

一、動態分區
舉例:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrick;
set hive.exec.max.dynamic.partitions.pernode=1000;
set hive.exec.max.created.files=100000000;
set hive.exec.max.dynamic.partitions=100000000;
use databasename;
insert overwrite table HotelRankings_Alg_Features partition(d)
select 
a.*
,a.orderdate
from databasename.tmp_ym_hotel_multiple_features_table_new_2 a
where orderdate<='2016-08-01'
distribute by  orderdate;
(1)使用動態分區可以很好的解決上述問題。動態分區可以根據查詢得到的數據自動匹配到相應的分區中去。 
使用動態分區要先設置hive.exec.dynamic.partition參數值爲true,默認值爲false,即不允許使用:
 (2)動態分區可以允許所有的分區列都是動態分區列,但是要首先設置一個參數hive.exec.dynamic.partition.mode :
 hive> set hive.exec.dynamic.partition.mode;
 hive.exec.dynamic.partition.mode=strict 
它的默認值是strick,即不允許分區列全部是動態的,這是爲了防止用戶有可能原意是隻在子分區內進行動態建分區,但是由於疏忽忘記爲主分區列指定值了,這將導致一個


dml語句在短時間內創建大量的新的分區(對應大量新的文件夾),對系統性能帶來影響。
 所以我們要設置:
 hive> set hive.exec.dynamic.partition.mode=nostrick;
(3)再介紹3個參數:
 hive.exec.max.dynamic.partitions.pernode (缺省值100):每一個mapreduce job允許創建的分區的最大數量,如果超過了這個數量就會報錯
 hive.exec.max.dynamic.partitions (缺省值1000):一個dml語句允許創建的所有分區的最大數量
 hive.exec.max.created.files (缺省值100000):所有的mapreduce job允許創建的文件的最大數量
 (4)爲了讓分區列的值相同的數據儘量在同一個mapreduce中,這樣每一個mapreduce可以儘量少的產生新的文件夾,可以藉助distribute by的功能,
 將分區列值相同的數據放到一起:
hive> insert overwrite table partition_test partition(stat_date,province)
 > select member_id,name,stat_date,province from partition_test_input distribute by stat_date,province;
 Total MapReduce jobs = 1
 ...
 18 Rows loaded to partition_test
 OK


二、查看文件(分區)大小的方法 
 [hotel@VMS05618 ~]$ hadoop dfs -ls hdfs://ns/user/hive/warehouse/databasename.db/tablename/d=2016-11-06
 
三、Hive下查看數據表信息的方法
方法1:查看錶的字段信息
desc table_name;
方法2:查看錶的字段信息及元數據存儲路徑
desc extended table_name;
方法3:查看錶的字段信息及元數據存儲路徑(在尾部)
desc formatted table_name;   


四、分區問題
(1)Hive中有兩張表中擁有同一個字段名稱,在這兩個表做關聯的時候會報這個錯誤,例如:在當表別名用d,而表字段也行d這個字段時,

代碼會報:CONSOLE# FAILED: SemanticException Column d Found in more than One Tables/Subqueries


五、數字類型字符串判別
-----正確匹配的形式
select  '1234.' regexp '^[0-9]*\.[0-9]*$'  as reg;
select  '12.34' regexp '^[0-9]*\.[0-9]*$'  as reg;
select  '.1234' regexp '^[0-9]*\.[0-9]*$'  as reg;
----錯誤匹配的形式
select  '12.34.' regexp '^[0-9]*\.[0-9]*$'  as reg;
select  'a12.34' regexp '^[0-9]*\.[0-9]*$'  as reg;
select  '.1234中國' regexp '^[0-9]*\.[0-9]*$'  as reg;

其實正則匹配都比較相同," ^ " 表示開頭," $ "表示結尾," . " 表示 任意字符 ," * " 表示匹配模式裏面任意多個


六、導出Hive建表語句

hive> show create table hotel_click_browse;
OK
createtab_stmt
CREATE TABLE `hotel_click_browse`(
  `id` string COMMENT 'id', 
  `clientcode` string COMMENT '客戶code', 
  `hotelid` string COMMENT '母酒店id', 
  `checkin` string COMMENT '入住日期', 
  `checkout` string COMMENT '離店日期', 
  `hotelname` string COMMENT '酒店名', 
  `date` string COMMENT '日期')
COMMENT '酒店點擊詳情'
PARTITIONED BY ( 
  `d` string COMMENT 'test')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
LOCATION
  'hdfs://ns/user/hive/warehouse/庫名.db/hotel_click_browse'
TBLPROPERTIES (
  'metadata.partition.life'='-1', 
  'transient_lastDdlTime'='1479369645')
Time taken: 0.271 seconds, Fetched: 22 row(s)


五、刪除分區

ALTER TABLE dababasename.table_name DROP IF EXISTS PARTITION(d='2017-07-29');

注:在上面hive刪除語法中 d='2017-07-29' 月 '2017-07-29 ',代表的是一樣的。

       實際在創建時,也會如此。 如果創建了 '2017-07-29 ', 在覆蓋插入'2017-07-29'分區,則只會存在 '2017-07-29 '分區。

       尤其要注意,select  包含分區的字段時, '2017-07-29 '與'2017-07-29'則有分別。


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