23 大資料之hive(第四部 hive基礎)

荒-於嬉 發表於 2020-11-22

hive 其他操作命令

  1. hive中執行hdfs命令
    以dfs開頭,同樣是分號結尾,不過這種方式比起直接命令列操作會快一些,因為他不需要啟動jvm虛擬機器和關閉

    hive> dfs -ls /user;
    Found 1 items
    drwxr-xr-x   - root supergroup          0 2020-11-22 02:35 /user/hive
    hive> 
    
  2. hive中執行Linux命令

    hive> ! ls /root;
    anaconda-ks.cfg
    file
    hive.hql
    name
    nameb
    scp.sh
    split
    ssh.sh
    hive> 
    

hive 其他配置屬行

<property>
	<!-- 查詢時顯示列名 -->
	<name>hive.cli.print.header</name>
	<value>true</value>
</property>
<property>
	<!-- 在互動命令列顯示庫名資訊 -->
	<name>hive.cli.print.current.db</name>
	<value>true</value>
</property>
<property>
	<name></name>
	<value></value>
</property>
<property>
	<name></name>
	<value></value>
</property>
<property>
	<name></name>
	<value></value>
</property>

hive基本資料型別

型別長度解釋
int4byte 有符號整數數字型別
bigint8type 有符號整數數字型別
double雙精度浮點數小數,如3.14
string字串字串,使用時需要加引號
tinyint1byte 有符號整數數字型別
booleanbool型別true或者false
timestamp時間型別

集合資料型別

資料型別描述
struct可以通過點符號訪問元素內容,例如,如果某個列的資料型別是struct( first struct,last struct),那麼第一個元素可以通過 .first 來引用.
mapmap是一組鍵值對元素集合,使用陣列表示法可以訪問資料,如某個列資料型別是map,其中的鍵值對是 first -> john,last -> doe,那麼可以通過欄位名’last’獲取最後一個元素
array陣列是一組具有相同名稱和變數的集合,這些變數稱為陣列的元素,每個陣列元素都有一個編號,編號從零開始,如陣列值為[‘liulaoliu’,‘wulaowu’],那麼第二個元素可以用陣列名[1]進行引用

集合資料型別演示

準備三條資料資料,寫入檔案中,如/root/test

格式是: 姓名,愛好_愛好,年齡:key_性別:key,城市_國家

liulaoliu,chifan_shuijiao,age:60_gender:nan,beijing_zhongguo
qilaoqi,dayouxi_anmo,age:70_gender:nan,shanghai_zhongguo
wulaowu,yuepao_shuijiao,age:80_gender:nan,xianggang_zhongguo

將其設定為不同的資料型別
hive建表語句

create table test(
name_string string,
hobby_array array<string>,
information_map map<string,string>,
addres_struct struct<city:string,countries:string>
) row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';

語句解釋;

create table test( -- 建立表名稱
name_string string, -- 列名 型別 為了後期方便列名才用了 列名_型別
hobby_array array<string>, -- array,陣列型別
information_map map<string,string>,  -- map,鍵值對元素集合
addres_struct struct<city:string,countries:string> -- struct型別
) row format delimited -- 行格式化 設定 
fields terminated by ',' -- 指定列分隔符為逗號 
collection items terminated by '_' -- 指定集合分隔符
map keys terminated by ':' -- 指定map鍵值對分隔符為冒號
lines terminated by '\n'; -- 指定換行符,也就是下一行資料了

hive匯入資料

load data local inpath '/root/test' into table test;

檢視錶中的資料

hive (default)> select * from test;
OK
test.name_string	test.hobby_array	test.information_map	test.addres_struct
liulaoliu	["chifan","shuijiao"]	{"age":"60","gender":"nan"}	{"city":"beijing","countries":"zhongguo"}
qilaoqi	["dayouxi","anmo"]	{"age":"70","gender":"nan"}	{"city":"shanghai","countries":"zhongguo"}
wulaowu	["yuepao","shuijiao"]	{"age":"80","gender":"nan"}	{"city":"xianggang","countries":"zhongguo"}
Time taken: 0.144 seconds, Fetched: 3 row(s)
hive (default)> 

陣列其實就是Python的列表,後面就是字典.

如下,依舊是之前的取列,但是取出的是列表,可以根據索引取其中一個,如取出列表中的第一列.

hive (default)> select hobby_array from test;
OK
hobby_array
["chifan","shuijiao"]
["dayouxi","anmo"]
["yuepao","shuijiao"]
Time taken: 0.138 seconds, Fetched: 3 row(s)
hive (default)> select hobby_array from test;

取第一列

hive (default)> select hobby_array[0] from test;
OK
_c0
chifan
dayouxi
yuepao
Time taken: 0.364 seconds, Fetched: 3 row(s)
hive (default)> 

獲取map的age索引的值

hive (default)> select information_map["age"] from test;
OK
_c0
60
70
80
Time taken: 0.129 seconds, Fetched: 3 row(s)
hive (default)>

結構體的訪問

hive (default)> select information_map["age"],addres_struct.city from test;
OK
_c0	city
60	beijing
70	shanghai
80	xianggang
Time taken: 0.139 seconds, Fetched: 3 row(s)
hive (default)> 

列名.結構體中的某一個的key.

型別轉換

hive的原子資料是可以進行隱式轉換的,類似於Java的型別轉換,比如可以吧int型別轉化為bigint型別,但是不能反向轉換,如bigint 轉化為int,但是可以cast強行轉化.

隱式轉換規則

  1. 所有整數型別都可以轉化為更廣泛的型別,如tinyint轉化為int, int轉化為bigint,
  2. 所有整數型別,float,string都可以隱式的轉化為double.
  3. tinyint,int等都可以轉化為float.
  4. boolean不能轉化為任何型別

可以使用cast強制轉換,但是如果轉換失敗則會返回NULL.
如(字串轉為數字):

hive (default)> select cast('1' as int);
OK
_c0
1
Time taken: 0.482 seconds, Fetched: 1 row(s)

但是如果有字母字元,則會失敗

hive (default)> select cast('1a' as int);
OK
_c0
NULL
Time taken: 0.452 seconds, Fetched: 1 row(s)