1. 程式人生 > >Hive內部表、外部表、分割槽表以及外部分割槽表建立以及匯入資料例項講解

Hive內部表、外部表、分割槽表以及外部分割槽表建立以及匯入資料例項講解

源資料格式:

[[email protected]144113 zhang_dd_edw]$ more data.txt
25502#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15
25499#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16
25519#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17
25538#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18
25555#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19 25605#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21

1. 內部表的建立以及資料的匯入(重點:無論是內部表還是外部表,資料最終都會被移動到所使用的location下面,如果沒有指定,就預設移動到hive-site.xml中配置的location)
建立表的語句:

create table  10k_cold_data_inner_table(
    size string comment '冷資料大小'
, path string comment '冷資料路徑' ) row format delimited fields terminated by '#';

資料的匯入:

hive> load data local inpath '/home/dd_edw/zhang_dd_edw/data.txt' into table 10k_cold_data_inner_table  ;
Loading data to table bdm.10k_cold_data_inner_table
Table bdm.10k_cold_data_inner_table stats: [numFiles=
1, totalSize=474] OK Time taken: 0.725 seconds

資料的查詢:

hive> select *
    > from 10k_cold_data_inner_table;
OK
25502   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15
25499   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16
25519   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17
25538   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18
25555   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19
25605   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21
Time taken: 0.27 seconds, Fetched: 6 row(s)

2、外部表的建立以及資料的匯入
外部表的建立:

create external table  10k_cold_data_external_table(
    size string comment '冷資料大小',
    path string comment '冷資料路徑'
)
row format delimited
fields terminated by '#';

匯入資料:

hive> load data local inpath '/home/dd_edw/zhang_dd_edw/data.txt' into table 10k_cold_data_external_table  ;
Loading data to table bdm.10k_cold_data_external_table
Table bdm.10k_cold_data_external_table stats: [numFiles=1, totalSize=474]
OK
Time taken: 0.622 seconds

資料檢視:

hive> select *
    > from 10k_cold_data_external_table;
OK
25502   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15
25499   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16
25519   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17
25538   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18
25555   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19
25605   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21
Time taken: 0.265 seconds, Fetched: 6 row(s)

在Hive當中,對於外部表來說,我們在刪除表資料的時候,刪除的僅僅是表的元資料資訊,但是卻不能刪除掉表中的真實資料。
接下來我們測試一下:

hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table;
Found 1 items
-rwxr-xr-x   3 dd_edw dd_edw        474 2018-01-08 13:04 hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table/data.txt
hive> drop table 10k_cold_data_external_table;
OK
Time taken: 0.152 seconds
hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table;
Found 1 items
-rwxr-xr-x   3 dd_edw dd_edw        474 2018-01-08 13:04 hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table/data.txt

當然,對於外部表來說,我們還有很多玩法,如下:
源資料路徑:

[[email protected]144113 zhang_dd_edw]$ hadoop fs -cat hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table/data.txt
25502#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15
25499#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16
25519#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17
25538#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18
25555#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19
25605#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21

建立外部表:直接去關聯這個HDFS路徑

create external table  10k_cold_data_external_table_2(
    size string comment '冷資料大小',
    path string comment '冷資料路徑'
)
row format delimited
fields terminated by '#'
location 'hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table';

檢視資料:

hive> select *
    > from 10k_cold_data_external_table_2;
OK
25502   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15
25499   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16
25519   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17
25538   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18
25555   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19
25605   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21
Time taken: 0.085 seconds, Fetched: 6 row(s)

當然,我們在這裡面再次刪除表的元資料資訊,發現在HDFS中的真實資料還是存在:

hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table;
Found 1 items
-rwxr-xr-x   3 dd_edw dd_edw        474 2018-01-08 13:04 hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table/data.txt
hive> drop table 10k_cold_data_external_table_2;
OK
Time taken: 0.068 seconds
hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table;
Found 1 items
-rwxr-xr-x   3 dd_edw dd_edw        474 2018-01-08 13:04 hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table/data.txt

接下來我們在換一種玩法:(在這裡我們要弄懂一件事情:什麼時候回移動資料,什麼時候不會移動資料==>如果建表的時候指定了location,則不會移動,如果不指定,則向預設的HDFS路徑下面移動資料),對於下面的建表方式就會產生移動資料。
第一:我們先檢視源資料的路徑:

hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table ;
Found 1 items
-rwxr-xr-x   3 dd_edw dd_edw        474 2018-01-08 13:04 hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table/data.txt
hive> dfs -cat hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table/data.txt;
25502#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15
25499#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16
25519#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17
25538#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18
25555#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19
25605#hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21

第二:我們建立一個外部表

hive> create external table  10k_cold_data_external_table_2(    size string comment '冷資料大小',    path string comment '冷資料路徑')
    > row format delimited
    > fields terminated by '#';
OK
Time taken: 0.054 seconds

第三:我們向這個表當中匯入資料

hive> load data inpath 'hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table' into table 10k_cold_data_external_table_2;
Loading data to table bdm.10k_cold_data_external_table_2
Table bdm.10k_cold_data_external_table_2 stats: [numFiles=1, totalSize=474]
OK
Time taken: 0.297 seconds

第四:檢視資料

hive> select *
    > from 10k_cold_data_external_table_2;
OK
25502   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15
25499   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16
25519   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17
25538   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18
25555   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19
25605   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21
Time taken: 0.125 seconds, Fetched: 6 row(s)
hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table;
hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table_2 ;
Found 1 items
-rwxr-xr-x   3 dd_edw dd_edw        474 2018-01-08 13:04 hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_table_2/data.txt

很明顯,資料已經被移動過來了。
總結一下:無論內部表還是外部表,只要load data,資料都會被移動到表的location下面,(之前書中介紹的我感覺指的是一般人在建表的時候沒人指定location,刪除內部表的時候,表所關聯的資料夾和資料都會別刪除)。

3、外部分割槽表的建立以及匯入資料
這裡是重點。
首先我們先建立一個外部表:

create external table 10k_cold_data_external_partitions(
    size string comment '冷資料大小',
    path string comment '冷資料路徑'
)
partitioned by(dt string) 
row format delimited 
fields terminated by '#';

當我們在這個目錄下面建立dt=2018-01-08這個目錄之後,我們去檢視一下表的分割槽資訊:

hive> dfs -ls hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_partitions ;
Found 1 items
drwxr-xr-x   - dd_edw dd_edw          0 2018-01-08 15:16 hdfs://ns2/user/dd_edw/warehouse/bdm/10k_cold_data_external_partitions/dt=2018-01-08
hive> show partitions 10k_cold_data_external_partitions;
OK
Time taken: 0.048 seconds

呵呵,沒有,你知道這是為什麼嗎?這是因為雖然在HDFS當中資料已經存在了,但是在Hive的元資料倉庫中並沒有,所以我們查不到資料。
接下來我們新增相應的分割槽:

hive> alter table 10k_cold_data_external_partitions add partition(dt='2018-01-08');
OK
Time taken: 0.078 seconds
hive> show partitions 10k_cold_data_external_partitions;
OK
dt=2018-01-08
Time taken: 0.064 seconds, Fetched: 1 row(s)
hive> select *
    > from 10k_cold_data_external_partitions;
OK
25502   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-15        2018-01-08
25499   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-16        2018-01-08
25519   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-17        2018-01-08
25538   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-18        2018-01-08
25555   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-19        2018-01-08
25605   hdfs://ns1/user/dd_edw/adm.db/adm_dealer_order_list_di_big/dt=2015-07-21        2018-01-08
Time taken: 0.08 seconds, Fetched: 6 row(s)

但是問題來了,如果有100個分割槽呢?難道也需要手動加100個分割槽嗎?
這裡有一個簡單的命令操作:msck repair table table_name 即可。
關於更多細節:大家可以參考這個:http://blog.csdn.net/opensure/article/details/51323220
OK,外部分割槽表真的很重要,刷分割槽也很重要。