參考此博主文章:https://www.cnblogs.com/fefjay/p/6044474.html
一、關於Hive的insert into 和 insert overwrite與數據分區
1》數據分區:數據庫分區的主要目的是爲了在特定的SQL操作中減少數據讀寫的總量以縮減響應時間,主要包括兩種分區形式:水平分區與垂直分區。水平分區是對錶進行行分區。而垂直分區是對列進行分區,一般是通過對錶的垂直劃分來減少目標表的寬度,常用的是水平分區。
2》建立分區語法:
create external table if not exists tablename(
a string,
b string)
partitioned by (year string,month string)
row format delimited fields terminated by ',';
3》hive三種方式對包含分區字段的表進行數據插入:
1、靜態插入數據:要求插入數據時指定與建表時相同的分區字段,如:
insert overwrite tablename (year='2019', month='06') select a, b from tablename2;
2、動靜混合分區插入:要求指定部分分區字段的值,如:
insert overwrite tablename (year='2019', month) select a, b from tablename2;
3、動態分區插入:只指定分區字段,不用指定值,如:
insert overwrite tablename (year, month) select a, b from tablename2;
4》hive動態分區設置相關參數:
Hive.exec.dynamic.partition 是否啓動動態分區。false(不開啓) true(開啓)默認是 false
hive.exec.dynamic.partition.mode 打開動態分區後,動態分區的模式,有 strict和 nonstrict 兩個值可選,strict 要求至少包含一個靜態分區列,nonstrict則無此要求。各自的好處,大家自己查看哈。
hive.exec.max.dynamic.partitions 允許的最大的動態分區的個數。可以手動增加分區。默認1000
hive.exec.max.dynamic.partitions.pernode 一個 mapreduce job所允許的最大的動態分區的個數。默認是100
5》數據插入之insert into 和 insert overwrite
1、定義:hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供簡單的sql查詢功能,可以將sql語句轉換爲MapReduce任務進行運行。通常hive包括以下四種數據導入方式:
(1)、從本地文件系統中導入數據到Hive表;
(2)、從HDFS上導入數據到Hive表;
(3)、在創建表的時候通過從別的表中查詢出相應的記錄並插入到所創建的表中;
(4)、從別的表中查詢出相應的數據並導入到Hive表中。
INSERT INTO
樣例:
insert into table tablename1 select a, b, c from tablename2;
INSERT OVERWRITE
樣例:
insert overwrite table tablename1 select a, b, c from tablename2;
2、區別:insert into 與 insert overwrite 都可以向hive表中插入數據,但是insert into直接追加到表中數據的尾部,而insert overwrite會重寫數據,既先進行刪除,再寫入。如果存在分區的情況,insert overwrite會只重寫當前分區數據。