4.1環境准備
4.1.1 啟動Hadoop
4.1.2 安裝MySQL
1、安裝包
將安裝包復制到目錄/usr/local/,當前使用版本如下:
mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
解壓:
#tar xzvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
修改名稱:
#mv mysql-5.7.22-linux-glibc2.12-x86_64 mysql
創建mysql用戶組和用戶:
# groupadd mysql
# useradd -r -g mysql mysql
2、在/usr/local/mysql目錄下創建data目錄
#mkdir /usr/local/mysql/data
3、更改mysql目錄下所有的目錄及文件夾所屬的用戶組和用戶,以及權限
# chown -R mysql:mysql /usr/local/mysql
# chmod -R 755 /usr/local/mysql
4、編譯安裝並初始化mysql,務必記住初始化輸出日志末尾的密碼(數據庫管理員臨時密碼)
#cd /usr/local/mysql/bin
#./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
5、運行初始化命令成功后,輸出日志如下:
記錄日志最末尾位置root@localhost:后的字符串,此字符串為mysql管理員臨時登錄密碼。如當前為:ykmpcILAR7=_
6、編輯配置文件my.cnf,添加配置如下
# vi /etc/my.cnf
7、啟動mysql服務器
# /usr/local/mysql/support-files/mysql.server start
顯示如下結果,說明數據庫安裝成功
8、添加軟連接,並重啟mysql服務
#ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
#ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
#service mysql restart
9、登錄mysql,修改密碼(密碼為步驟5生成的臨時密碼)
#mysql -u root -p
Enter password:
mysql>set password for root@localhost = password('yourpass');
10、開放遠程連接
mysql>use mysql;
msyql>update user set user.Host='%' where user.User='root';
mysql>flush privileges;
11、設置開機自動啟動
- 將服務文件拷貝到init.d下,並重命名為mysql
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- 賦予可執行權限
# chmod +x /etc/init.d/mysqld
- 添加服務
# chkconfig --add mysqld
- 顯示服務列表
# chkconfig --list
12、驗證mysql數據庫是否可用
所用命令或代碼如下,此命令要在mysql安裝目錄下的bin文件夾下輸入:
# mysql –u root –p
實驗操作演示:
4.2安裝並配置hive
4.2.1 在apache官網下載Hive安裝包
安裝包已經存放到/usr/local目錄下,在/usr/local目錄下解壓Hive安裝包,所用命令或代碼:
# cd /usr/local
# tar zxvf apache-hive-3.1.2-bin.tar.gz
# mv apache-hive-3.1.2-bin hive
4.2.2 配置環境變量
修改環境變量,所用命令或代碼:
# vim /etc/profile
加入hive相關的環境變量
export HIVE_HOME=/usr/local/hive
export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf:$PATH
使修改文件生效:
# source /etc/profile
4.2.3 准備Hive的配置文件
進入hive 配置文件目錄:
# cd /usr/local/hive/conf
把初始化的文件復制一份出來 並且改名:
所用命令或代碼:
#cp hive-env.sh.template hive-env.sh
#cp hive-default.xml.template hive-site.xml
#cp hive-log4j2.properties.template hive-log4j2.properties
#cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties
實驗操作演示:
4.2.4 修改hive-env.sh
在該文件添加以下四個環境變量的配置:
#jdk目錄
export JAVA_HOME=/usr/local/jdk
#hadoop安裝目錄
export HADOOP_HOME=/usr/local/hadoop
##Hive安裝路徑
export HIVE_HOME=/usr/local/hive
##Hive配置文件路徑
export HIVE_CONF_DIR=${HIVE_HOME}/conf
實驗操作演示:
4.2.4 配置hive,使用mysql存放hive的元數據
1、復制mysql驅動程序到hive的lib目錄下
mysql驅動包已經放在local目錄下,復制過程如下。
注意:其他版本的驅動不一定兼容
# cp mysql-connector-java-5.1.17.jar /usr/local/hive/lib/
實驗操作演示:
2、配置hive-site.xml
- l 將${system:...字樣替換成具體路徑,具體修改項如下:
<property> <name>hive.exec.local.scratchdir</name> <value>/usr/local/hive</value> <description>hive作業的暫存空間</description> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/usr/local/hive/downloads</value> <description>遠程添加資源文件的臨時目錄 </description> </property> <property> <name>hive.querylog.location</name> <value>/usr/local/hive/querylog</value> <description>Location of Hive run time structured log file</description> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/usr/local/hive/server2_logs</value> <description>Top level directory where operation logs are stored if logging functionality is enabled</description> </property>
- l 在 hive-site.xml 文件中配置 MySQL 數據庫連接信息。
<property> <name>javax.jdo.option.ConnectionURL</name> <value> jdbc:mysql://192.168.11.130:3306/hive</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>111</value> </property>
4.2.5 在msyql中創建存放hive信息的數據庫
命令如下:
mysql>create database hive;
實驗操作演示:
4.2.6 初始化hive的元數據(表結構)到mysql中
所用命令或代碼:
# cd /usr/local/hive/bin
# schematool -dbType mysql –initSchema
實驗操作演示:
4.3 Hive的訪問
所用命令或代碼:
# hive –v
實驗操作演示:
4.4 HiveQL:數據定義
4.4.1 應用HiveQL創建數據庫
1) 進入Hive命令模式
所用命令或代碼:(如果已經進入Hive命令模式則略過此步驟)
# hive
實驗操作演示:
2) 創建數據庫hive
所用命令或代碼:
hive> create database hive;
實驗操作演示:
如果hive數據庫已經存在,則會拋出異常,可以加上if not exists關鍵字,則不會拋出異常。
hive> create database if not exists hive;
3) 查看創建好的數據庫
所用命令或代碼:
hive> show databases;
實驗操作演示:
4) 使用創建好的數據庫
所用命令或代碼:
hive>use hive;
實驗操作演示:
4.4.2 應用HiveQL創建表
1) 創建usr表
在hive數據庫中,創建表usr,含三個屬性id,name,age。
所用命令或代碼:
hive>create table if not exists usr(id bigint,name string,age int);
實驗操作演示:
2) 創建表時定義分隔符
所使用命令:
# create table employee (id int,name string,salary int,position string) row format delimited fields terminated by '\t' ;
3) 復制表
a、復制表結構和數據
所使用命令:
# create table employee2 as select * from employee ;
查詢結果:
b、復制表結構
所使用命令:
# create table employee3 like employee;
查詢結果:
4.4.3 應用HiveQL創建分區表
分區表可以從目錄的層面控制搜索數據的范圍。
1、創建分區表
所使用命令:
# CREATE TABLE t(id int,name string,age int) PARTITIONED BY (Year INT, Month INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
2、添加分區,創建目錄
# alter table t add partition (year=2014, month=11) partition (year=2014, month=12);
3、顯式表的分區信息
所使用命令:
# SHOW PARTITIONS t;
4、刪除分區
所使用命令:
# ALTER TABLE t DROP IF EXISTS PARTITION (year=2014, month=12);
5、查看分區結構
如上圖所示:
/user/hive/warehouse/hive.db/t/year=2014/month=11
/user/hive/warehouse/hive.db/t/year=2014/month=12
所使用命令:
# dfs -lsr /;
6、查看表結構
所使用命令:
# desc employee;
4.4.4 應用HiveQL創建視圖
1、 創建視圖
創建視圖little_usr,只包含usr表中id,age屬性
實驗操作演示:
所用命令或代碼:
hive>create view little_usr as select id,age from usr;
2、 查看所有的表和視圖
實驗操作演示:
所用命令或代碼:
hive> show tables;
3、查看以u開頭的所有表和視圖
實驗操作演示:
所用命令或代碼:
hive> show tables in hive like 'u*';
4.5 HiveQL:數據操作
4.5.1 實驗准備
- 本地/usr/local/data目錄下創建文件sample.txt,並插入以下內容:
1201 Gopal 45000 Technical manager
1202 Manis 45000 Proof reader
1203 Masth 40000 Technical writer
1204 Kiran 40000 Hr Admin
1205 Kranthi 30000 Op Admin
- 創建employee表
所用命令或代碼:
# create table employee (id int,name string,salary int,position string) row format delimited fields terminated by '\t' ;
4.5.2 應用LOAD DATA語句向數據表內加載文件
將本地/usr/local/data目錄下文件sample.txt內容裝載到employee表中:
所用命令或代碼:
# LOAD DATA LOCAL INPATH '/usr/local/data/sample.txt' overwrite into table employee;
查詢表內數據:
所使用命令代碼:
# select * from employee;
4.5.3 應用INSERT語句將查詢結果插入數據表
- insert into方式插入一條數據:
所使用命令代碼:
# insert into employee(id,name,salary ,position ) values(1206,'tom',50000,'admin');
查詢插入結果:
- 應用INSERT語句將查詢結果插入數據表:
創建備份表employee1:
所使用命令:
# create table employee1 (id int,name string,salary int,position string) row format delimited fields terminated by '\t' ;
將查詢結果追加到表:
所使用命令:
# INSERT INTO TABLE employee1 select * from employee;
查詢插入結果:
再次插入數據:
查詢結果顯示:
4.5.4 應用INSERT語句將查詢結果覆蓋數據表
應用INSERT語句將查詢結果覆蓋目的數據表
所使用命令:
# INSERT overwrite TABLE employee1 select * from employee;
查詢結果顯示:
INSERT語句后跟overwrite將覆蓋目的數據表的數據。
4.6 HiveQL:數據查詢
4.6.1 基本的Select 操作
- 基本查詢
查詢employee表中數據:
所使用命令:
# select * from employee;
或者
# select t.id,t.name,t.salary,t.position from employee t;
- limit
所使用命令:
# select * from employee limit 3;
- 區間查詢between and
所使用命令:
# select * from employee t where t.salary between 40000 and 45000;
- 空查詢is null
所使用命令:
# select t.id no,t.name,t.salary from employee t where t.id is null;
- 不空查詢is not null
所使用命令:
# select t.id no,t.name,t.salary from employee t where t.id is not null;
- 集合查詢in
所使用命令:
# select t.id no,t.name,t.salary from employee t where t.name in (‘tom’,’Gopal’);
- 不在集合范圍內not in
所使用命令:
# select t.id no,t.name,t.salary from employee t where t.name not in (‘tom’,’Gopal’);
- 函數查詢
最高工資max
所使用命令:
# select max(e.salary) from employee e;
最低工資min
所使用命令:
# select min(salary) from employee e;
總人數count
所使用命令:
# select count(*) from employee e;
公司月總支出sum
所使用命令:
# select sum(salary) from employee e;
平均工資avg
所使用命令:
# select avg(salary) from employee e;
- ORDER BY與SORT BY
ORDER BY的使用:
所使用的命令:
# select * from employee e order by e.salary;
SORT BY的使用:
# select * from employee e sort by e.salary;
4.6.2 基於分區的查詢
加載數據到表分區,以第五章創建的表t為例。
1) 加載數據到分區
在/usr/local/data/文件夾下創建customer.txt文件,其內容為:
加載數據到分區:
所使用命令:
# load data local inpath ‘/usr/local/data/customer.txt' into table t partition(year=2014,month=11);
查詢結果:
加載數據到分區(year=2014,month=12)和查詢結果:
2) 基於分區的查詢
所使用命令:
# select * from t where month=12 and name like ‘tom%’;
4.6.3 基於Join的查詢
兩個表進行連接,例如有兩個表m n ,m表中的一條記錄和n表中的一條記錄組成一條記錄。
1) 實驗准備:
/usr/local/data目錄下創建兩個數據文件:
創建員工表和部門表:
所使用命令如下:
# create table emp (id int,depno int,name string,salary int,position string) row format delimited fields terminated by '\t' ;
# create table dep (id int,name string) row format delimited fields terminated by '\t' ;
導入數據:
所使用命令如下:
# LOAD DATA LOCAL INPATH '/usr/local/data/emp.txt' overwrite into table emp;
# LOAD DATA LOCAL INPATH '/usr/local/data/dep.txt' overwrite into table dep;
2) join on :等值連接
所使用命令:
# select e.id,e.name, d.id,d.name from emp e join dep d on e.depno = d.id;
3) left join:左連接
左連接表示以join左邊數據為主,若join右邊的數據不存在則補空。
所使用命令:
# select e.id,e.name, d.id,d.name from emp e left join dep d on e.depno = d.id;
4) right join:右連接
右連接表示以join右邊數據為主,若join左邊的數據不存在則補空。
所使用命令:
# select e.id,e.name, d.id,d.name from emp e right join dep d on e.depno = d.id;