一、分區(qū)的定義
二、靜態(tài)分區(qū)、動(dòng)態(tài)分區(qū)對(duì)比
靜態(tài)分區(qū)與動(dòng)態(tài)分區(qū)的主要區(qū)別在于靜態(tài)分區(qū)是手動(dòng)指定,是編譯時(shí)進(jìn)行分區(qū)。支持load和insert兩種插入方式。適合于分區(qū)數(shù)少、分區(qū)名可以明確的數(shù)據(jù)
而動(dòng)態(tài)分區(qū)是通過數(shù)據(jù)來進(jìn)行判斷,是在SQL執(zhí)行時(shí)進(jìn)行分區(qū)。只支持inset這一種插入方式。需要先開啟動(dòng)態(tài)設(shè)置。實(shí)際項(xiàng)目里按日期進(jìn)行分區(qū)的數(shù)據(jù)一般都是動(dòng)態(tài)分區(qū)
三、HDFS數(shù)據(jù)準(zhǔn)備
(一)HDFS文件后綴名以日期區(qū)分
(二)查看數(shù)據(jù)樣式
四、Hive建普通外部表? 不分區(qū)
(一)建表語句
create external table if not exists ods_evaluation( device_no string COMMENT '設(shè)備編號(hào)', cycle int COMMENT '評(píng)價(jià)數(shù)據(jù)周期', lane_num int, create_time timestamp COMMENT '創(chuàng)建時(shí)間', lane_no int COMMENT '車道編號(hào)', volume int COMMENT '車道內(nèi)過停止線流量(輛)', queue_len_max float COMMENT '車道內(nèi)最大排隊(duì)長(zhǎng)度(m)', sample_num int COMMENT '評(píng)價(jià)數(shù)據(jù)計(jì)算樣本量', stop_avg int COMMENT '車道內(nèi)平均停車次數(shù)(次)', delay_avg float COMMENT '車道內(nèi)平均延誤時(shí)間(s)', stop_rate float COMMENT '車道內(nèi)一次通過率', travel_dist float COMMENT '車道內(nèi)檢測(cè)行程距離(m)', travel_time_avg float COMMENT '車道內(nèi)平均行程時(shí)間' ) comment '評(píng)價(jià)數(shù)據(jù)表' row format delimited fields terminated by ',' stored as textfile location '/rtp/evaluation' tblproperties("skip.header.line.count"="1") ;
(二)結(jié)果展示? 共9076條數(shù)據(jù)
五、靜態(tài)分區(qū)
(一)建表語句
create external table if not exists ods_evaluation_static( device_no string COMMENT '設(shè)備編號(hào)', cycle int COMMENT '評(píng)價(jià)數(shù)據(jù)周期', lane_num int, create_time timestamp COMMENT '創(chuàng)建時(shí)間', lane_no int COMMENT '車道編號(hào)', volume int COMMENT '車道內(nèi)過停止線流量(輛)', queue_len_max float COMMENT '車道內(nèi)最大排隊(duì)長(zhǎng)度(m)', sample_num int COMMENT '評(píng)價(jià)數(shù)據(jù)計(jì)算樣本量', stop_avg int COMMENT '車道內(nèi)平均停車次數(shù)(次)', delay_avg float COMMENT '車道內(nèi)平均延誤時(shí)間(s)', stop_rate float COMMENT '車道內(nèi)一次通過率', travel_dist float COMMENT '車道內(nèi)檢測(cè)行程距離(m)', travel_time_avg float COMMENT '車道內(nèi)平均行程時(shí)間' ) comment '評(píng)價(jià)歷史數(shù)據(jù)表 靜態(tài)分區(qū)' partitioned by (day string) --分區(qū)字段不能是表中已經(jīng)存在的數(shù)據(jù),可以將分區(qū)字段看作表的偽列。 row format delimited fields terminated by ',' tblproperties("skip.header.line.count"="1") ;
注意點(diǎn):
1、指定的分區(qū)字段不能是表中已經(jīng)存在的數(shù)據(jù)? 我這邊分區(qū)字段為day? 而表中沒有這個(gè)字段
2、建表沒有指定文件路徑
(二)加載數(shù)據(jù)(有坑)
注意:從HDFS中加載數(shù)據(jù)到Hive,如果直接load HDFS中的數(shù)據(jù)到Hive中,那么原HDFS數(shù)據(jù)文件就會(huì)消失在原路徑,而是去了一個(gè)hive的新地方。直接load,這種行為它類似于剪切,而不是我們所希望的復(fù)制文件。 這是一個(gè)坑?。?!
所以如果我們希望既可以load數(shù)據(jù)到hive,還能夠保存HDFS的原文件,那么必須采用迂回策略,從HDFS先到本地,再load到Hive。比如加載HDFS中2023-05-09的數(shù)據(jù)
先從HDFS到l本地? /opt/hdfs_rtp/
[root@hurys22 conf]# hdfs dfs -get /rtp/evaluation/evaluation2023-05-09.csv /opt/hdfs_rtp/
從本地加載到Hive
load data local inpath '/opt/hdfs_rtp/evaluation2023-05-09.csv' into table ods_evaluation_static partition(day='2023-05-09');
(三)查看分區(qū)
show partitions ods_evaluation_static;
(四)查看數(shù)據(jù)
?六、動(dòng)態(tài)分區(qū)
(一)建表語句
create external table if not exists ods_evaluation_trends( device_no string COMMENT '設(shè)備編號(hào)', cycle int COMMENT '評(píng)價(jià)數(shù)據(jù)周期', lane_num int, create_time timestamp COMMENT '創(chuàng)建時(shí)間', lane_no int COMMENT '車道編號(hào)', volume int COMMENT '車道內(nèi)過停止線流量(輛)', queue_len_max float COMMENT '車道內(nèi)最大排隊(duì)長(zhǎng)度(m)', sample_num int COMMENT '評(píng)價(jià)數(shù)據(jù)計(jì)算樣本量', stop_avg int COMMENT '車道內(nèi)平均停車次數(shù)(次)', delay_avg float COMMENT '車道內(nèi)平均延誤時(shí)間(s)', stop_rate float COMMENT '車道內(nèi)一次通過率', travel_dist float COMMENT '車道內(nèi)檢測(cè)行程距離(m)', travel_time_avg float COMMENT '車道內(nèi)平均行程時(shí)間' ) comment '評(píng)價(jià)歷史數(shù)據(jù)表 動(dòng)態(tài)分區(qū)' partitioned by (day string) row format delimited fields terminated by ',';
注意:由于動(dòng)態(tài)分區(qū)不是load文件,所以建表時(shí)不需要截掉第一行數(shù)據(jù) tblproperties("skip.header.line.count"="1")
(二)開啟動(dòng)態(tài)分區(qū)
--開啟動(dòng)態(tài)分區(qū)功能(默認(rèn) true,開啟) set hive.exec.dynamic.partition=true; --設(shè)置為非嚴(yán)格模式 nonstrict 模式表示允許所有的分區(qū)字段都可以使用動(dòng)態(tài)分區(qū) set hive.exec.dynamic.partition.mode=nonstrict; --在每個(gè)執(zhí)行 MR 的節(jié)點(diǎn)上,最大可以創(chuàng)建多少個(gè)動(dòng)態(tài)分區(qū) set hive.exec.max.dynamic.partitions.pernode=1000; --在所有執(zhí)行 MR 的節(jié)點(diǎn)上,最大一共可以創(chuàng)建多少個(gè)動(dòng)態(tài)分區(qū)。默認(rèn) 1000 set hive.exec.max.dynamic.partitions=1500;
(三)動(dòng)態(tài)加載數(shù)據(jù)(insert overwrite)
insert overwrite table ods_evaluation_trends partition(day) select device_no, cycle, lane_num, create_time, lane_no, volume, queue_len_max, sample_num, stop_avg, delay_avg, stop_rate, travel_dist, travel_time_avg,date(create_time) day from ods_evaluation;
注意:insert overwrite的用法
insert into 與 insert overwrite 都可以向hive表中插入數(shù)據(jù),但是insert into是直接追加到目前表中數(shù)據(jù)的尾部,而insert overwrite則會(huì)重寫數(shù)據(jù),即先刪除數(shù)據(jù),再寫入數(shù)據(jù)。如果存在分區(qū)的情況,insert overwrite只重寫當(dāng)前分區(qū)
(四)查看動(dòng)態(tài)分區(qū)
show partitions ods_evaluation_trends;
文章來源:http://www.zghlxwxcb.cn/news/detail-527202.html
?(五)查看數(shù)據(jù)
文章來源地址http://www.zghlxwxcb.cn/news/detail-527202.html
到了這里,關(guān)于一百一十一、Hive——從HDFS到Hive的數(shù)據(jù)導(dǎo)入(靜態(tài)分區(qū)、動(dòng)態(tài)分區(qū))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!