舉例:
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'則有分別。