Hive是Hadoop的常用工具之一,Hive查詢語言(HiveQL)的語法和SQL類似,基本實現了SQL-92標准。
1. 表的建立
編寫以下的文件:
USE test; DROP TABLE IF EXISTS student2; CREATE TABLE student2( id INT, name STRING, age INT, course ARRAY<STRING>, body MAP<STRING,FLOAT>, address STRUCT<street:STRING,number:INT> ) PARTITIONED BY (state STRING,city STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
保存為test.hql,該文件指定了表的結構和分隔符。Hive的數據類型除了INT、STRING、FLOAT等基本類型以外,還有三種復雜數據類型:STRUCT、MAP和ARRAY。PARTITIONED BY()指定了表的分區字段,分區字段只能出現一次,否則會出錯。ROW FORMAT DELIMITED指定了各種分隔符。最后指定了文件存儲格式為TEXTFILE。
在Linux終端里輸入如下命令:
hive -f test.hql
該命令執行了test.hql文件,創建了表student2(前提是test數據庫已經被創建)。可以進入hive,輸入
desc student2;
命令查看該表的結構:
2. 從文件導入數據
在Linux中創建一個文本文件,保存為/home/hadoop/student2:
1 Tom 20 Chinese,Maths,English Height:165,Weight:80 South Street,101 Sichuan Chengdu
2 Mike 25 Chinese,Maths,English,Computer Science Height:175,Weight:70 North Street,105 Sichuan Chengdu
3 Peter 26 Java,Hadoop Height:168,Weight:68 East Street,12 Sichuan Chengdu
在Hive中輸入以下命令將該文件里面的數據導入student2:
load data local inpath '/home/hadoop/student2' overwrite into table student2 partition(state='Sichuan', city='Chengdu');
overwrite表示將以前的數據覆蓋,local表示是從本地文件導入,如果沒有寫local,則表示從HDFS文件導入。如果文本文件里面沒有寫最后面的Sichuan和Chengdu,導入數據時會自動把這兩個字段分別設置為Sichuan和Chengdu,因為在partition中已經指定了Sichuan和Chengdu。
執行命令:
select * from student2;
可見數據已經被導入表student2:
3. 通過查詢語句導入數據
新建一張表student3,結構和student3一致,然后輸入命令:
from student2
insert overwrite table student3 partition(state='Sichuan', city='Chengdu') select id,name,age,course,body,address;
該命令將student2中的數據導入到student3。注意select后面不能寫"*",否則會出錯,只能寫除了分區字段以外的其他字段。查看student3,可見數據已經被導入:
4. 數據的導出
輸入命令:
insert overwrite local directory '/home/hadoop/hive1' select * from student2;
將數據導出到本地文件。先新建了一個hive1文件夾,然后將數據導入到hive1文件夾里面的000000_0文件。