【HIVE】不會Java也能操作Hadoop,常用HQL語句,收藏就是賺了。

show databases;

查看都有哪些數據庫。

create database park;

創建park數據庫

創建的數據庫,實際是在Hadoop的HDFS文件系統裡創建一個目錄節點,統一存在: /user/hive/warehouse 目錄下

【HIVE】不會Java也能操作Hadoop,常用HQL語句,收藏就是賺了。

use park;

進入park數據庫

show tables;

查看當前數據庫下所有表

create table stu (id int,name string);

創建stu表,以及相關的兩個字段

hive裡,用的是string,不用char和varchar。此外,所創建的表,也是HDFS裡的一個目錄節點

【HIVE】不會Java也能操作Hadoop,常用HQL語句,收藏就是賺了。

insert into stu values(1,'zhang')

向stu表插入數據

1.HDFS不支持數據的修改和刪除,但是在2.0版本後支持了數據追加。實際上,insert into 語句執行的是追加操作。

2.所以注意:hive支持查詢,行級別的插入。不支持行級別的刪除和修改。

3.hive的操作實際是執行一個job任務,調用的是Hadoop的MR。

【HIVE】不會Java也能操作Hadoop,常用HQL語句,收藏就是賺了。

4.插入完數據之後,發現HDFS stu目錄節點下,多了一個文件,文件裡存了插入的數據,所以得出結論,hive存儲的數據,是通過HDFS的文件來存儲的。

select * from stu

查看錶數據

也可以根據字段來查詢,比如select id from stu

drop table stu

刪除表

select * from stu

查詢stu表數據

有時會出現這樣的情況:

【HIVE】不會Java也能操作Hadoop,常用HQL語句,收藏就是賺了。

原因是:我們從外部導入的文件的數據格式是:

1 jary

2 rose

即第一列和第二列是以空格為分隔符的。

但是把數據導入到hive之後,hive並不知道分隔符是什麼,所以就不能正確的切分數據。所以顯示null。

解決辦法:在hive創建表的時候,要指定分割符,並且這個分割符要和外部文件裡的分割符一致。詳見下面指令

load data local inpath '/home/software/1.txt' into table stu;

通過加載文件數據到指定的表裡

【HIVE】不會Java也能操作Hadoop,常用HQL語句,收藏就是賺了。

在執行完這個指令之後,發現hdfs stu目錄下多了一個1.txt文件。由此可見,hive的工作原理實際上就是在管理hdfs上的文件,把文件裡數據抽象成二維表結構,然後提供hql語句供程序員查詢文件數據。可以做這樣的實驗:不通過load 指令,而通過插件向stu目錄下再上傳一個文件,看下hive是否能將數據管理到stu表裡。

create table stu1(id int,name string) row format delimited fields terminated by ' ';

創建stu1表,並指定分割符 空格。

此時,把外部數據導入hive,就可以正確查出數據了。

【HIVE】不會Java也能操作Hadoop,常用HQL語句,收藏就是賺了。

desc stu

查看stu表結構。

create table stu2 like stu

創建一張stu2表,表結構和stu表結構相同,

只複製表結構不復制數據。

insert overwrite table stu2 select * from stu

把stu表數據插入到stu2表中

insert overwrite 可用於將select 查詢出的數據插入到指定的表中或指定的目錄下

比如:把查詢結果存到本地指定的目錄下,

執行:insert overwrite local directory '/home/stu' row format delimited fields terminated by ' ' select * from stu;

也可以將查詢結果存到HDFS文件系統上

執行:insert overwrite directory '/stu' row format delimited fields terminated by ' ' select * from stu;

也可以將查詢結果插入到多張表中

執行:from stu insert overwrite table stu1 select * insert overwrite table stu2 select *;結果是把stu表的數據插入 stu1和stu2 表。(也可以加where 條件等,比如select * where id>3)

alter table stu rename to stu2

將stu重命名為stu2

alter table stu add columns (age int);

為表stu增加一個列字段age,類型為int

Exit

退出hive

當退出hive後,我們可以嘗試做這樣的一件事:之前我們是在bin目錄執行:sh hive 進入的現在,我們換一個目錄來進入hive,比如: sh /bin/hive 來進入當我們查看數據庫或查看錶時,發現之前建立的park和stu表都沒有了。原因:hive可以管理hdfs上的文件,用表的形式來管理文件數據。

而表名、表裡有哪些字段,字段類型、哪張表存在哪個數據下等這些表信息,稱之為hive的元數據信息。

知識點:hive的元數據信息不是存在hdfs上的,而是存在hive自帶的derby關係型數據庫裡的。

即hive管理的數據是在hdfs上的,hive的元數據信息是存在關係型數據庫裡的。

上述問題出現的原因就是由於derby數據庫引起的,這個數據庫功能不完善,僅用於測試。

derby數據庫存儲hive元數據的方式:當在bin目錄下進入hive時,derby數據會在bin目錄下生成一個metastore_db目錄,將元數據信息存在這個目錄下。

當換個目錄,比如在home 目錄下hive時,derby又會在home目錄下生成一個metastore_db目錄,存儲元數據信息。

解決辦法:將默認使用的derby數據庫換成mysql數據庫

(後續更新hive的MySQL安裝配置,歡迎轉發關注)


分享到:


相關文章: