大資料(十八):Hive元資料配置、常見屬性配置、資料型別與資料轉換
一、Hive元資料配置到MySQL當中
為什麼要把Hive的元資料配置到MySql中?我們可以使用多個客戶端連線linux系統並且都嘗試啟動Hive,可以發現在啟動第二個Hive客戶端的時候發生報錯了。
那是應為在預設的情況下,Hive元資料被儲存在內嵌的Derby資料庫中,只允許一個會話的連線。在開發的時候多人使用這個Hive的將會變得非常噁心。我們通過將元資料配置到MySQL中,讓其支援多個會話的連線。
1.安裝MySQL,參考網站:https://blog.csdn.net/qq_17776287/article/details/53536761
2.下載mysql對應的連線驅動包。
3.將下載好的mysql連線驅動上傳到/usr/local/hive/lib資料夾下(hive目錄下的lib資料夾裡)
4.在/usr/local/hive/conf(hive目錄下的conf資料夾裡)目錄下建立一個hive-site.xml檔案
5.根據官方文件的配置引數,拷貝資料到hive-site.xml檔案中
官方文件:https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
具體配置如下(對應的地方改成你自己的配置):
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://{mysql所在伺服器的host}:{mysql連線埠}/{資料庫名稱}?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>{mysql使用者名稱}</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>{mysql使用者密碼}</value> </property> </configuration>
6.配置完畢後,如果啟動hive異常,可以重新啟動一下機器。(重啟後別忘記啟動hadoop叢集)
二、hive常用互動命令引數
-help:幫助命令
-e:不進入hive的互動視窗執行SQL語句,例如:hive -e "select id from student;"
-f:執行指令碼檔案中的sql語句,例如:hive -f /opt/sql/hivef.sql
執行檔案中的sql語句並將結果寫入檔案中,hive -f opt/sql/hivef.sql > /opt/sql/hive_result.txt
三、hive其他的命令操作
1.在hive cli命令視窗中使用hdfs檔案系統命令
例如:檢視hdfs檔案系統:dfs -ls /;
2.在在hive cli命令視窗中使用本地檔案系統命令
例如:檢視linux下檔案系統:! ls /;
3.檢視hive中輸入的所有歷史命令
進入~目錄下,“.hivehistory”檔案中存放著歷史命令
四、Hive常見屬性配置
1.hive資料倉庫位置配置
-
Default資料倉庫的最原始位置是hdfs上的:/user/hive/warehouse路徑下
-
在倉庫目錄下,沒有對預設的資料庫default建立資料夾。如果某張表屬於default資料庫,直接在資料倉庫目錄下建立一個資料夾。
-
修改default資料倉庫原始位置(在hive-site.xml中修改)
<property>
<name>hive.metastore.warehouse.dir</name>
<value>{新的位置}</value>
</property>
2.顯示當前資料庫名稱和查詢表的表頭資訊
在hive-site.xml中新增如下資訊
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
修改之後效果如下:
3.Hive執行日誌資訊配置
-
hive的log預設存放在/tmp/{當前使用者名稱}/hive.log目錄下
-
修改hive的log存放日誌到/usr/local/hive/logs
-
修改/usr/local/hive/conf/hive-log4j.properties.template檔名稱為hive-log4j.properties
-
在hive-log4j.properties檔案中修改log存放位置
-
hive.log.dir=/usr/local/hive/logs
四、引數配置方式
1.檢視當前配置資訊
hive客戶端中輸入set命令
2.引數配置的三種方式
-
配置檔案配置
預設的配置檔案:hive-default.xml
使用者自定義配置檔案:hive-site.xml (需要直接新建檔案)
使用者自定義的配置會覆蓋掉預設配置。另外,hive也會讀取Hadoop的配置,hive是作為Hadoop的客戶端啟動的,hive的配置會覆蓋掉hadoop的配置。配置檔案的設定對所有本機啟動的hive程序都起效。
-
命令列引數設定
例如:啟動hive是,在命令列新增-hiveconf param=value來設定引數,hive -hiveconf mapred.reduce.tasks=10;
僅對本次hive啟動有效
-
引數宣告方式
可以在HQL中使用set關鍵字設定引數,set mapred.reduce.tasks=10;
僅對本次hive啟動有效
上述三種設定方式的優先順序依次遞增。配置檔案<命令列引數<引數宣告。注意某些系統級的引數,例如log4j相關的設定,必須用前兩種方式設定,這些引數的讀取在會話建立之前就完成了。
五、Hive資料型別
1.基本資料型別
Hive資料型別 |
Java資料型別 |
長度 |
TINYINT |
byte |
1byte有符號整數 |
SMALINT |
short |
2byte有符號整數 |
INT |
int |
4byte有符號整數 |
BIGINT |
long |
8byte有符號整數 |
BOOLEAN |
boolean |
布林型,true或者false |
FLOAT |
float |
單精度浮點型 |
DOUBLE | double |
雙精度浮點型 |
STRING |
string |
字串 |
TIMESTAMP |
|
時間型別 |
BINART |
|
位元組陣列 |
對於hive的String型別響度與資料庫的varchar型別,這個型別是一個可變的字串,不過他不能宣告其中最多能儲存多少個字元,理論上它可以儲存2GB的字元數
2.集合資料型別
資料型別 |
描述 |
STRUCT |
和C語言中的struct類似,都可以通過“點”符號訪問元素類容 |
Map |
Map是一組鍵值對元組集合,使用陣列表示法可以訪問資料。 |
ARRAY |
陣列是一組具有相同型別和名稱的變數集合。 |
Hive有三種複雜資料型別ARRAY、MAP和STRUCT。ARRAY和MAP與java中的array和map相似,二struct與c語言中的Struct類似,他封裝了一個命名欄位集合,複雜資料型別執行任意層次的巢狀。
六、資料型別例項
1.假設某表有如下一行,我們用JSON格式來表示其資料結構。在Hive下訪問的格式為
{
"name": "songsong",
"friends": ["bingbing" , "lili"] , //列表Array,
"children": { //鍵值Map,
"xiao song": 18 ,
"xiaoxiao song": 19
}
"address": { //結構Struct,
"street": "hui long guan" ,
"city": "beijing"
}
}
2.基於上述資料結構,我們在Hive裡建立對應的表,並匯入資料。
建立本地測試檔案test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
3. Hive上建立測試表test
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
4.匯入文字資料到測試表(hive客戶端中執行)
load data local inpath '/{檔案路徑}/test.txt' into table test;
5.訪問三種集合列裡的資料,以下分別是ARRAY,MAP,STRUCT的訪問方式
select friends[1],children['xiao song'],address.city from test where name="songsong";
七、資料型別轉換
Hive的原子資料型別是可以進行隱式轉換的,類似於Java的型別轉換,例如某表示式使用INT型別,TINYINT會自動轉換為INT型別,但是Hive不會進行反向轉化,例如,某表示式使用TINYINT型別,INT不會自動轉換為TINYINT型別,它會返回錯誤,除非使用CAST 操作。
1.隱式型別轉換規則如下。
-
任何整數型別都可以隱式地轉換為一個範圍更廣的型別,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。
-
所有整數型別、FLOAT和STRING型別都可以隱式地轉換成DOUBLE。
-
TINYINT、SMALLINT、INT都可以轉換為FLOAT。
-
BOOLEAN型別不可以轉換為任何其它的型別。
2.可以使用CAST操作顯示進行資料型別轉換,例如CAST('1' AS INT)將把字串'1' 轉換成整數1;如果強制型別轉換失敗,如執行CAST('X' AS INT),表示式返回空值 NULL。