啥是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;
開放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文檔)
全字段查詢
特點字段查詢