hive的簡單學習

啥是hive?爲啥學習它?

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供類SQL查詢功能。

因爲直接使用MapReduce實現複雜查詢邏輯開發難度格外的大,使用Hive能夠使用類SQL語法,提供效率。

有這麼些個特點:可擴展(自由擴展規模),可延展(支持自定義函數),有容錯(節點有問題SQL仍可工作)

 

 

Hive與Hadoop關係   ------->   Hive利用HDFS存儲數據,利用MapReduce查詢數據

 

 

Hive與傳統數據庫有什麼區別?(自我感覺最大的區別是Hive能處理大量數據,但是執行很慢)

 

區別:hive是類sql語言,存儲在Hadoop上;不支持對數據的改寫和添加;沒有建立索引,具有高延遲;通過MapReduce執行;可擴展性與Hadoop一致,很高;支持大規模數據。

詳細區別可以看這篇文章    ----------->   Hive 和sql數據庫區別

 

 

 

 

 

 

 

 

1.安裝hive(元數據庫版)

(Hive只在一個節點上安裝即可,安裝hive的機器必須要安裝hadoop,hadoop可以不運行,但是必須安裝,hive的執行依賴hadoop的jar包)

1.上傳hive

 

2.解壓  輸入;tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /export/servers/

3.安裝MySQL數據庫  (裝哪裏沒關係,只要能聯通hadoop集羣節點就好)

首先看看有沒有衝突   輸入:rpm -qa | grep mysql

 發現有衝突,刪除它  輸入:rpm -e mysql-libs-5.1.73-5.el6_6.x86_64 --nodeps

導入包


4.安裝server   輸入:

 

查看密碼

啓動mysql

5.安裝客戶端    輸入:rpm -ivh MySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm

用初始密碼登陸    輸入:mysql -uroot -pZDjxi2FzziHtlrQB

修改密碼  輸入: set password=password("123456")

 

 

 

 

 2.配置hive

首先進入配置文件目錄下

 拷貝一份,然後配置環境變量

 

 

 

 

 配置元數據庫信息   輸入:vim hive-site.xml(如果出現can not open file for write說名)

 

 

 

 

 

 5.拷貝jar包

 

 

 拷到虛擬機上還要拷到指定目錄       輸入:cp mysql-connector-java-5.1.28.jar /export/servers/apache-hive-1.2.1-bin/lib/

之後進入mysql授權,輸入:mysql -uroot -p  進去之後輸入:GRANT ALL PRIVILEGES ON.TO 'root'@"%"IDENTIFIED BY'123456' WITH GRANT OPTION;

  #(執行下面的語句 .:所有庫下的所有表 %:任何IP地址或主機都可以連接)(需要改成自己的mysql的用戶名和密碼)

輸入:FLUSH PRIVILEGES;

 

 

 開放localhost連接

 

解決包版本不一致的問題,進去hive(注意開MySQL)

 

 

注:hive啓動時,保錯cannot access /export/servers/spark/lib/spark-assembly-*.jar: No such file o  修改hive中sparkAssemblyPath,修改爲/jars/*.jar   詳情看這個   Hive啓動時報錯

hive的清屏命令    ctrl  l  刪除表  :hive> drop table if exists 表名;

 看一下數據庫

 

 6.內部表操作

啓動hive  輸入:/export/servers/apache-hive-1.2.1-bin/bin/hive

創建數據庫 輸入:create database studentInfo;

 上網頁可以看到

 

 接下來在student這個數據庫中建表   輸入:use studentInfo;

 

 

建表  輸入: create table student(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',' stored as textfile;

 

 

create table course(Cno int,Sname string) row format delimited fields terminated by ',' stored as textfile;
create table sc(Sno int,Cno int,Grade int) row format delimited fields terminated by ',' stored as textfile;

(先進庫才能show tables)

 

 

 在data下建立個文件夾,在文件夾下導入表

 

 

 接着去hive下輸入:load data local inpath '/export/data/hive/students.txt' overwrite into table student;

 

 

 同時還有另外兩個表  輸入:load data local inpath '/export/data/hive/sc.txt' overwrite into table sc;

輸入:load data local inpath '/export/data/hive/course.txt' overwrite into table course;

 

 

 

 7.開始測試(類SQL語句)(注意要在自己的那個數據庫裏   use database)

查詢全體學生的學號和姓名   輸入:select Sno,Sname from student;

 

 查詢選修課程的學生姓名   輸入:select distinct Sname from student inner join sc on student.Sno=Sc.Sno  (select distinct 用於返回唯一不同的值。inner join內連接)(每一次這種查找都會通過mapreduce進行操作可以看到 )

 查詢學生的總人數  輸入:select count(*) from student

 計算1好課程的學生平均成績          hive> select avg(Grade) from sc where Cno=1;

 

 

 計算各科成績平均分           select Cno,avg(Grade) from sc group by Cno;

查詢選修1號課程的學生最高分數                   select Grade from sc where Cno=1 order by Grade;

 

 

 選修了3門以上的課程的學生學號     select Sno from sc group by Sno having count(Cno)>3;

 

 

 查詢學生信息,結果區分別性別按年齡有序   輸入:insert overwrite local directory '/home/apps/hadoop-2.7.4/out' select * from student distribute by Sex sort by Sage;

 

 

 

 

 

 查詢每個學生及其選修課程的情況

select student.*,sc.* from student join sc on student.Sno = sc.Sno;

查詢學生的得分情況

select student.Sname,course.Sname,sc.Grade from student join sc on student.Sno=sc.Sno join course on sc.cno=course.cno;

查詢選修2號課程且成績在90分以上的所有學生

 

select student.Sname,sc.Grade from student join sc on student.Sno=sc.Sno
where  sc.Cno=2 and sc.Grade>90;

查詢所有學生的信息,如果在成績表中有成績,則輸出成績表中的課程號
 select student.Sname,sc.Cno from student left outer join sc on student.Sno=sc.Sno;

查詢與“劉晨”在同一個系學習的學生
select s1.Sname from student s1 left semi join student s2 on s1.Sdept=s2.Sdept and s2.Sname='劉晨';

 

 

 

 

 

 右

 

sort by   order by    distribute by 的區別:

sort By,它通常發生在每一個redcue裏,“order by” 和“sort by"的區別在於,前者能給保證輸出都是有順序的,而後者如果有多個reduce的時候只是保證了輸出的部分有序。set mapred.reduce.tasks=<number>在sort by可以指定,在用sort by的時候,如果沒有指定列,它會隨機的分配到不同的reduce裏去。distribute by 按照指定的字段對數據進行劃分到不同的輸出reduce中
  此方法會根據性別劃分到不同的reduce中 ,然後按年齡排序並輸出到不同的文件中

九.外部表操作

1.將student.txt 文件上傳到hdfs的/stu目錄下,用來模擬生產環境下的數據文件

 2.創建一張外部表

create external table student_ext(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',' location '/stu';

創建了一張外部表,最後和根下的/stu相關聯

3.查看數據庫中的數據表

 4.查看數據表內容:

 

 

 

 十:分區表

1.現在expor/data/hive/user.txt下建立文件

 

2.創建分區表

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

 3.加載數據是講數據文件移動到與hive表對應的位置,從本地(linux虛擬機)複製或移動到hdfs的操作,由於分區表在映射數據時不能實用hadoop命令移動文件,需要使用load命令。

 

 

 4.看一眼,可以看出,分區表與結構化數據完成映射。

 

 5.再次新增分區

 

 

 

再修改分區,查看情況

 

 

 

 

 

動態分區

1.開啓動態分區功能  (默認值strict,表示必須指定至少一個靜態分區,nonstrict表示允許所有的分區字段都可以使用動態分區。)

 

 2.在建一個新的txt  /export/data/hivedata/dynamic_partition_table.txt

 

 3.建表

 

 4.導數據

 

 看一眼

 

 5創建目錄表

 

 

 

 6.動態插入

 

 7.看一眼(我這裏動態插入好像有點問題)

 

 桶表

 
桶表,是根據某個屬性字段把數據分成幾個桶,也就是在文件的層面上把數據分開。(這裏有問題!)

環境配置,使hive能夠識別桶

 

 

 創建桶表   以學生編號Sno分爲4個桶,以','爲分隔符的桶表

create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string) clustered by(Sno) into 4 buckets row format delimited fields terminated by ',';

 

 將hdfs的/stu/目錄下的結構化文件student.txt 複製到/hivedata 目錄下,創建臨時的student表,代碼如下:

create table student_tmp (Sno int, Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',';

 

 

 

 

 把student.txt上傳,加載數據至student_tmp 表

 

 將數據導入stu_buck 表(額,卡住不動了,查看數據也沒有導入進去,兓了)(如果成了就應該能同select*fromstu_buck看到有分佈)

 

 語句練習

先建表

建emp表     create table emp(empno int,ename string,job string,mgr int,hiredate string,sal double,comm double,deptno int) row format delimited fields terminated by '\t';

建dept表     create table dept(deptno int,dname string,loc int)  row format delimited fields terminated by '\t';

後導文件

load data local inpath '/export/data/hivedata/emp.txt' into table emp;

load data local inpath '/export/data/hivedata/dept.txt' into table dept;

 

 開始操作(導入完後如果發現全是null,那麼可能是你分隔符的問題,檢查txt文檔)

全字段查詢

 特點字段查詢

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章