中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hive中怎么實現動態分區和靜態分區

發布時間:2021-08-05 16:30:10 來源:億速云 閱讀:611 作者:Leah 欄目:編程語言

hive中怎么實現動態分區和靜態分區,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、基本概念

  hive中分區表分為:范圍分區、列表分區、hash分區、混合分區等。

  分區列:分區列不是表中的一個實際的字段,而是一個或者多個偽列。翻譯一下是:“在表的數據文件中實際上并不保存分區列的信息與數據”,這個概念十分重要,要記住,后面是經常用到。

1.1 創建數據表

  下面的語句創建了一個簡單的分區表:

hive中怎么實現動態分區和靜態分區

create table partition_test(
  member_id string,
  name string
)
partitioned by (
  stat_date string,
  province string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

復制代碼

1.2 創建分區

  這個例子中創建了stat_date和province兩個字段作為分區列。如果要添加數據,通常情況下我們需要先創建好分區,然后才能使用該分區,例如:

alter table partition_test add partition (stat_date='20141113',province='jilin');

  這樣就創建好了一個分區。這時我們會看到hive在HDFS存儲中創建了一個相應的文件夾:

hive> dfs -ls /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113;
Found 1 items
drwxr-xr-x   - ticketdev ticketdev          0 2014-11-13 17:50 /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/province=jilin
h

  每一個分區都會有一個獨立的文件夾,在這個例子中stat_date是主文件夾,province是子文件夾,如:

hive中怎么實現動態分區和靜態分區

hive> alter table partition_test add partition (stat_date='20141113',province='beijing');     
OK
Time taken: 0.119 seconds
hive> dfs -ls /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/;              
Found 2 items
drwxr-xr-x   - ticketdev ticketdev          0 2014-11-13 18:06 /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/province=beijing
drwxr-xr-x   - ticketdev ticketdev          0 2014-11-13 17:50 /user/ticketdev/hive/warehouse/partition_test/stat_date=20141113/province=jilin

復制代碼

二、靜態分區

2.1 數據準備

  基本知識介紹到這里,下面開始插入數據。我使用一個輔助的非分區表partition_test_input準備向partition_test中插入數據:

hive中怎么實現動態分區和靜態分區

hive> desc partition_test_input;
OK
stat_date string
member_id string
name string
province string

hive> select * from partition_test_input;
OK20110526 1 liujiannan liaoning20110526 2 wangchaoqun hubei20110728 3 xuhongxing sichuan20110728 4 zhudaoyong henan20110728 5 zhouchengyu heilongjiang

復制代碼

2.2 添加數據

  然后我向partition_test的分區中插入數據:

hive中怎么實現動態分區和靜態分區

hive> insert overwrite table partition_test partition(stat_date='20110728',province='henan') select member_id,name from partition_test_input where stat_date='20141113' and province='beijing';
Total MapReduce jobs = 2...1 Rows loaded to partition_test
OK

復制代碼

  還可以同時向多個分區插入數據:

hive中怎么實現動態分區和靜態分區

hive>> from partition_test_input> insert overwrite table partition_test partition (stat_date='20110526',province='liaoning')> select member_id,name where stat_date='20110526' and province='liaoning'> insert overwrite table partition_test partition (stat_date='20110728',province='sichuan')> select member_id,name where stat_date='20110728' and province='sichuan'> insert overwrite table partition_test partition (stat_date='20110728',province='heilongjiang')> select member_id,name where stat_date='20110728' and province='heilongjiang';
Total MapReduce jobs = 4...3 Rows loaded to partition_test
OK

復制代碼

  特別要注意,在其他數據庫中,一般向分區表中插入數據時系統會校驗數據是否符合該分區,如果不符合會報錯。而在hive中,向某個分區中插入什么樣的數據完全是由人來控制的,因為分區鍵是偽列,不實際存儲在文件中,如:

hive中怎么實現動態分區和靜態分區

hive> insert overwrite table partition_test partition(stat_date='20110527',province='liaoning') select member_id,name from partition_test_input;
Total MapReduce jobs = 2...5 Rows loaded to partition_test
OK

hive> select * from partition_test where stat_date='20110527' and province='liaoning';
OK1 liujiannan 20110527 liaoning2 wangchaoqun 20110527 liaoning3 xuhongxing 20110527 liaoning4 zhudaoyong 20110527 liaoning5 zhouchengyu 20110527 liaoning

復制代碼

  可以看到在partition_test_input中的5條數據有著不同的stat_date和province,但是在插入到partition(stat_date='20110527',province='liaoning')這個分區后,5條數據的stat_date和province都變成相同的了,因為這兩列的數據是根據文件夾的名字讀取來的,而不是實際從數據文件中讀取來的:

hive中怎么實現動態分區和靜態分區

$ hadoop fs -cat /user/hive/warehouse/partition_test/stat_date=20110527/province=liaoning/000000_01,liujiannan2,wangchaoqun3,xuhongxing4,zhudaoyong5,zhouchengyu

復制代碼

三、動態分區

  下面介紹一下動態分區,因為按照上面的方法向分區表中插入數據,如果源數據量很大,那么針對一個分區就要寫一個insert,非常麻煩。況且在之前的版本中,必須先手動創建好所有的分區后才能插入,這就更麻煩了,你必須先要知道源數據中都有什么樣的數據才能創建分區。

  使用動態分區可以很好的解決上述問題。動態分區可以根據查詢得到的數據自動匹配到相應的分區中去。

  使用動態分區要先設置hive.exec.dynamic.partition參數值為true,默認值為false,即不允許使用:

hive> set hive.exec.dynamic.partition;
hive.exec.dynamic.partition=false
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition;
hive.exec.dynamic.partition=true

  動態分區的使用方法很簡單,假設我想向stat_date='20110728'這個分區下面插入數據,至于province插入到哪個子分區下面讓數據庫自己來判斷,那可以這樣寫:

hive中怎么實現動態分區和靜態分區

hive> insert overwrite table partition_test partition(stat_date='20110728',province)> select member_id,name,province from partition_test_input where stat_date='20110728';
Total MapReduce jobs = 2...3 Rows loaded to partition_test
OK

復制代碼

  stat_date叫做靜態分區列,province叫做動態分區列。select子句中需要把動態分區列按照分區的順序寫出來,靜態分區列不用寫出來。這樣stat_date='20110728'的所有數據,會根據province的不同分別插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夾下,如果源數據對應的province子分區不存在,則會自動創建,非常方便,而且避免了人工控制插入數據與分區的映射關系存在的潛在風險。

  注意,動態分區不允許主分區采用動態列而副分區采用靜態列,這樣將導致所有的主分區都要創建副分區靜態列所定義的分區:

hive> insert overwrite table partition_test partition(stat_date,province='liaoning')> select member_id,name,province from partition_test_input where province='liaoning';
FAILED: Error in semantic analysis: Line 1:48 Dynamic partition cannot be the parent of a static partition 'liaoning'

  動態分區可以允許所有的分區列都是動態分區列,但是要首先設置一個參數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個參數:

  • hive.exec.max.dynamic.partitions.pernode (缺省值100):每一個mapreduce job允許創建的分區的最大數量,如果超過了這個數量就會報錯

  • hive.exec.max.dynamic.partitions (缺省值1000):一個dml語句允許創建的所有分區的最大數量

  • hive.exec.max.created.files (缺省值100000):所有的mapreduce job允許創建的文件的最大數量

關于hive中怎么實現動態分區和靜態分區問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洞头县| 维西| 滨州市| 邓州市| 昌乐县| 富裕县| 溧阳市| 库尔勒市| 永宁县| 云梦县| 通辽市| 佛坪县| 黄梅县| 定结县| 容城县| 万山特区| 宜兴市| 京山县| 临桂县| 西和县| 滦平县| 广昌县| 荥经县| 洱源县| 洛隆县| 天水市| 灵丘县| 友谊县| 图片| 临江市| 泽普县| 揭阳市| 峨眉山市| 高州市| 涟水县| 乳源| 安陆市| 海城市| 小金县| 奉贤区| 元谋县|