【hive】hive建立庫,表相關
菜雞一隻,如果有說錯的地方還請大家指出批評!
很多人,會有這樣的想法:這個東西,很簡單嘛,這樣這樣這樣,就可以。當然一部分情況確實是這樣的,不過有些時候,讓你親身去做這件事情,你又會覺得完全和想的是兩碼事,覺得困難重重。
沒錯,我就是這樣!
我一直覺得hive建表,建庫很簡單啊!但是老是會忘記命令的具體寫法,所以特地開一篇帖子來記錄下我這個缺點和相關的sql。
1、資料型別:
官網:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
當然會有些朋友不喜歡看英文官網,我也找到中文的翻譯,而且寫的很不錯:
在這裡我就記錄下簡單的東西:
#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、建表
我覺得建表的寫法比較。。。雜,寫全和寫不全的區別還是蠻大的。
但是總體上就是規定這麼幾個東西
- 資料欄位分隔符(預設是''/001",一般可以用逗號,tab鍵,或者“|”來代替,但是最好只用一個字元來分割,不要多個)
- 資料儲存方式,官網:https://cwiki.apache.org/confluence/display/Hive/FileFormats(較常用orc,最簡單是textfile)
- 其他項,例如:自定義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
#這樣就可以檢視前兩行檔案
大概就是這樣,沒太多營養,更多的是我自己想記錄下,省得每次要用的時候都要翻官網翻部落格~