1. 程式人生 > >【hive】hive建立庫,表相關

【hive】hive建立庫,表相關

菜雞一隻,如果有說錯的地方還請大家指出批評!

很多人,會有這樣的想法:這個東西,很簡單嘛,這樣這樣這樣,就可以。當然一部分情況確實是這樣的,不過有些時候,讓你親身去做這件事情,你又會覺得完全和想的是兩碼事,覺得困難重重。

沒錯,我就是這樣!

我一直覺得hive建表,建庫很簡單啊!但是老是會忘記命令的具體寫法,所以特地開一篇帖子來記錄下我這個缺點和相關的sql。

 

1、資料型別:

官網:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

當然會有些朋友不喜歡看英文官網,我也找到中文的翻譯,而且寫的很不錯:

https://blog.csdn.net/xiaoqi0531/article/details/54667393#hive資料型別(作者:VictorYao_117)

在這裡我就記錄下簡單的東西:

#cast是用來做型別轉換的,比如轉化日期成為可以加減的時間戳
cast(unix_timestamp(start_time) as bigint)as ts


#修改欄位名和型別
ALTER TABLE 表名 CHANGE COLUMN 要修改的欄位名 修改後的名字(如果不改可以保留原名) 修改的型別;
#eg.
>create table a(a int ,b string);
>desc a;
a                   	int                 	                    
b                   	string  
#將a表的欄位a改成欄位c,並且修改型別為DECIMAL(38,18);
>ALTER TABLE a CHANGE COLUMN a c DECIMAL(38,18);
>desc a;
c                   	decimal(38,18)      	                    
b                   	string

當然,我要強調下,hive中能使用string解決問題就儘量使用string解決問題,不然後面你會發現一些很不舒服的事情。

比如:

報型別轉換異常的錯

又比如,一些小數點後面有很多位的數字,展示出來的時候被科學計數法!

關於科學計數法的解決辦法http://www.it610.com/article/761847.htm

2、建庫

#建立資料庫:
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  	[COMMENT database_comment]
  	[LOCATION hdfs_path]
  	[WITH DBPROPERTIES (property_name=property_value, ...)];
#eg.
create database 資料庫名 comment '描述資訊' location '/user/warehouse/資料庫名.db'

3、建表

我覺得建表的寫法比較。。。雜,寫全和寫不全的區別還是蠻大的。

但是總體上就是規定這麼幾個東西

  1. 資料欄位分隔符(預設是''/001",一般可以用逗號,tab鍵,或者“|”來代替,但是最好只用一個字元來分割,不要多個)
  2. 資料儲存方式,官網https://cwiki.apache.org/confluence/display/Hive/FileFormats(較常用orc,最簡單是textfile)
  3. 其他項,例如:自定義Serde,自定義input或者output

所以不寫全,就如下:

#指定分隔符為"|" ,資料格式為文字格式(textfile)
create table origin_log1(
欄位1 string,
欄位2 string,
欄位3 string,
...
欄位10 string
)row format delimited fields terminated by '|'
STORED AS TEXTFILE;

create table origin_log2(
欄位1 string,
欄位2 string,
欄位3 string,
...
欄位10 string
)row format delimited fields terminated by '\t'
STORED AS ORC;

寫全的話:

#建立一張textfile格式的表,並且一級分割槽為月份,二級分割槽為天,分隔符為"|"
CREATE TABLE `資料庫名`.`表名`(
  `欄位1` string COMMENT '欄位1描述', 
  `欄位2` string COMMENT '欄位2描述', 
  `欄位3` string COMMENT '欄位3描述', 
  ...
  `欄位10` string COMMENT '欄位10描述'
)
PARTITIONED BY ( 
  `month_id` string, 
  `day_id` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'field.delim'='|', 
  'serialization.format'='|') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 'XXXX'
#如上的location也可以不寫,會自動建表到對應資料庫的hdfs路徑下

寫全也容易寫錯,所以可以通過寫不全的方式建立其他格式的表,然後再通過

show create table 表名來檢視不同格式的inputformat和outputformat的區別!

最後通過load data方式載入資料

#LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]  

#從本地上傳資料到表中,本地原檔案不會消失,相當於copy
load data local inpath 'linux路徑上的資料' into table hive中的表名;

#從hdfs上傳資料到指定表中,原檔案會消失,相當於mv
load data inpath 'hdfs路徑上的資料' into table hive中的表名;

#還可以選擇overwrite,將表中原有資料先清空,再載入新的資料

哦!在載入資料的時候順便提一句

hdfs上的資料是可以做壓縮的,比如GZip,生成的檔案會以gz結尾,如果想要看資料的話,使用-cat會亂碼,但是使用-text就不會

#這樣會亂碼
hive> dfs -cat hdfs://路徑/檔名.gz

#這樣不會亂碼
hive> dfs -text hdfs://路徑/檔名.gz

#如果只想看這個檔案的前幾行,在hive命令列中我沒想到怎麼操作
#但是可以直接使用hdfs命令+linux命令

bin/hdfs dfs -text hdfs://路徑/檔名.gz | head -2

#這樣就可以檢視前兩行檔案

 

大概就是這樣,沒太多營養,更多的是我自己想記錄下,省得每次要用的時候都要翻官網翻部落格~

結束語,菜雞一隻,歡迎評論和提問~