❶ 如何基於一個hdfs文件創建hive表
1. 創建一個表,帶分區
create table if not exists kd_ud.tmp_sex
(
pid string
,phone string
,sex string
,source string
,prob string
)
partitioned by (pt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY 『\t』 STORED AS TEXTFILE;
2. 掛載hdfs目錄下的一個文件到hive 表中
alter table kd_ud.tmp_sex add partition(pt=』2016-02-17』) location 『/user/rd/dm/support/passenger/sex』;
❷ hive的分區和分桶有什麼卻別
1、一個表可以擁有一個或者多個分區,每個分區以文件夾的形式單獨存在表文件夾的目錄下。
2、表和列名不區分大小寫。
3、分區是以欄位的形式在表結構中存在,通過describe table命令可以查看到欄位存在,但是該欄位不存放實際的數據內容,僅僅是分區的表示。
4、建表的語法(建分區可參見PARTITIONED BY參數):
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
5、分區建表分為2種,一種是單分區,也就是說在表文件夾目錄下只有一級文件夾目錄。另外一種是多分區,表文件夾下出現多文件夾嵌套模式。
a、單分區建表語句:create table day_table (id int, content string) partitioned by (dt string);單分區表,按天分區,在表結構中存在id,content,dt三列。
b、雙分區建表語句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);雙分區表,按天和小時分區,在表結構中新增加了dt和hour兩列。
❸ hive分區的作用
Hive分區。
是指按照數據表的某列或某些列分為多個區,區從形式上可以理解為文件夾,比如我們要收集某個大型網站的日誌數據,一個網站每天的日誌數據存在同一張表上,由於每天會生成大量的日誌,導致數據表的內容巨大,在查詢時進行全表掃描耗費的資源非常多。那其實這個情況下,我們可以按照日期對數據表進行分區,不同日期的數據存放在不同的分區,在查詢時只要指定分區欄位的值就可以直接從該分區查找。
下面從用shell命令操作分區表和從hdfs文件系統查看分區表相結合的方式加深對分區表的認識。
第一,創建分區表並將本地文件中的數據載入到分區表中。
要注意的是:首先,創建分區表的時候,要通過關鍵字 partitioned by (name string)聲明該表是分區表,並且是按照欄位name進行分區,name值一致的所有記錄存放在一個分區中,分區屬性name的類型是string類型。當然,可以依據多個列進行分區,即對某個分區的數據按照某些列繼續分區。
其次,向分區表導入數據的時候,要通過關鍵字partition(name=「jack」)顯示聲明數據要導入到表的哪個分區,這里表示要將數據導入到分區為name=jack的分區。
再次,這里要重點強調,所謂分區,這是將滿足某些條件的記錄打包,做個記號,在查詢時提高效率,相當於按文件夾對文件進行分類,文件夾名可類比分區欄位。這個分區欄位形式上存在於數據表中,在查詢時會顯示到客戶端上,但並不真正在存儲在數據表文件中,是所謂偽列。所以,千萬不要以為是對屬性表中真正存在的列按照屬性值的異同進行分區。比如上面的分區依據的列name並不真正的存在於數據表中,是我們為了方便管理添加的一個偽列,這個列的值也是我們人為規定的,不是從數據表中讀取之後根據值的不同將其分區。我們並不能按照某個數據表中真實存在的列,如userid來分區
❹ hive distribute by 和group by 的區別
hive
distribute
by
和group
by
的區別:
group
by是對檢索結果的保留行進行單純分組,一般總愛和聚合函數一塊用例如AVG(),COUNT(),max(),main()等一塊用。
distribute
by是控制在map端如何拆分數據給rece端的。hive會根據distribute
by後面列,對應rece的個數進行分發,默認是採用hash演算法。sort
by為每個rece產生一個排序文件。在有些情況下,你需要控制某個特定行應該到哪個recer,這通常是為了進行後續的聚集操作。distribute
by剛好可以做這件事。因此,distribute
by經常和sort
by配合使用。
註:Distribute
by和sort
by的使用場景
1.Map輸出的文件大小不均。
2.Rece輸出文件大小不均。
3.小文件過多。
4.文件超大。
拋磚引玉,不足之處還望大神指正~
❺ Hive分區過多有何壞處以及分區時的注意事項
1.當分區過多且數據很大時,可以使用嚴格模式,避免出發一個大的maprece任務。當分區數量過多且數據量較大時,執行寬范圍的數據掃描會觸發一個很大的maprece任務。在嚴格模式下,當where中沒有分區過濾條件時會禁止執行。
2.hive如果有過多的分區,由於底層是存儲在HDFS上,HDFS上只用於存儲大文件 而非小文件,因為過多的分區會增加namenode的負擔。
3.hive會轉化為maprece,maprece會轉化為多個task。過多小文件的話,每個文件一個task,每個task一個JVM實例,JVM的開啟與銷毀會降低系統效率。