# Hive是基于Hadoop的一个数据仓库工具,作为数据仓库工具,一般要具备2个方面的能力:一是数据的存储,另一个是ETL。
# Hive以HDFS作为存储,MapReduce作为数据分析。
# 在整个生态圈中,hive是为了简化MapReduce的开发难度。 MR实现复杂查询逻辑开发难度太大。主要用来做离线数据分析。
# 操作接口采用类SQL语法,叫HQL,提供快速开发能力;扩展功能方便。
# Hive 的主要三个特点:
# 可扩展 :可自由扩展集群规模,一般不需要重启服务。
# 延展性 :支持用户自定义函数,用户可根据需求实现自己的函数
# 容错 :良好的容错性,节点出问题SQL仍可完成。
#在已经安装配置好JDK以及Hadoop的前提下,安装mysql, 再安装Hive-1.2.2 相对容易配置。
########################## Hive & derby #不推荐使用此方式
tar zxvf apache-hive-1.2.2-bin.tar.gz
mv apache-hive-1.2.2-bin hive-1.2.2
cd hive/bin
# 使用derby数据库的最大问题是:不同的路径启动,元数据无法共享。
# hadoop需要先正常启动运行
./hive # 进入shell
show databases;
create database abc;
use abc;
create table t_test(id int);
show tables;
############################ 使用 mysql 的方式 生产环境使用。
yum install mysql mysql-server mysql-devel # yum安装mysql及其依赖
cd /var/lib/mysql #这是mysql所在目录
cd /usr/share/mysql/ #相关文件
vim /etc/my.cnf #主要配置文件
# 更详细的安装与配置 https://www.cnblogs.com/chinesern/p/8440206.html
/etc/init.d/mysqld start #启动
mysql #mysql控制台
USE mysql;
update user set password=PASSWORD('newpassword') where user='root';
grant all PRIVILEGES on *.* to 'root'@'%' IDENTIFIED BY 'newpassword' with grant option;
FLUSH PRIVILEGES; --更改root密码,授权远程连接,生效。
service mysqld status # 检查mysqld是否运行
chkconfig mysqld on
mysql -u root -p #使用新密码连接
########## 配置hive
vim conf/hive-env.sh
export HADOOP_HOME=/usr/local/src/hadoop-2.7.5
vim conf/hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>111111</value>
<description>passowrd to use against metastore database</description>
</property>
</configuration>
# 如果是hive-default.xml复制的,以及高版本的。修改太复杂,就sz到本机来操作。
# 安装mysql连接器驱动 到hive/lib中 https://dev.mysql.com/downloads/connector/
cd hive/lib
rz mysql-connector-java-5.1.46.jar
# 启动 bin/hive
show databases;
create database test;
describe database test; # 查看库信息
use test; ## 使用库
show tables; # 显示表
show partitions table_name; # 显示表分区信息
show functions; # 显示hive支持的所有方法
desc formatted table_name; # 查看表信息
### Hive的几种使用方式:
# 1. Hive 交互shell bin/hive
# 2. Hive JDBC服务(参考java jdbc连接mysql)
# 3. hive启动为一个服务器,对外提供服务 会启动一个进程 Runjar
bin/hiveserver2 #启动服务后,使用beeline连接。生产环境中最常用的方式。
bin/beeline -u jdbc:hive2://master:10000 -n root # 连接方式,默认端口10000
bin/beeline
! connect jdbc:hive2://master:10000 # 另一种连接方式
# 4. hive命令 # 不常用
hive -e 'sql'
bin/hive -e 'show databases'
### 以上4种方法,第3种方法使用时在命令行方式下最美观。
###################### Hive 数据映射
# Hive本身没有存储功能,所有的数据都存在HDFS中。
# 1. 采用cp文件到数据表文件位置的方法
hdfs dfs -put 1.txt /hivedata
hive:
show databases; use test;
create table t_t1(id int, name string, age int);
# http://master:50070 下,会有对应的文件/user/hive/warehouse/test.db/t_t1
hdfs dfs -cp /hivedata/1.txt /user/hive/warehouse/test.db/t_t1
create table t_t2(id int, name string, age int) row format delimited fields terminated by ','; # 带有分隔符创建表
hdfs dfs -cp /hivedata/1.txt /user/hive/warehouse/test.db/t_t2
select * from t_t2;
select count(*) from t_t2; # 此句将执行mr程序 http://master:8088 将可以看到进程
# 2. 采用load 文件数据到 数据表的方法 ,不必先上传文件
create table t_t3(id int, name string, age int) row format delimited fields terminated by '\t'; # 带有\t分隔符创建表
load data local inpath '/test/data2' into table t_t3; # 载入也有同样\t分隔符的数据
######################## 复杂类型的数据表指定分隔符
# 建表的时候一定要根据结构化数据文件的分隔符类型 指定分隔符
# 建表的字段个数和字段类型 要跟结构化数据中的个数类型一致
# 分隔符一般使用内置的来指定 ROW FORMAT DELIMITED 分割字段还是分割集合,等。
#### 示例1.txt 数据:
Alex BJ,JS,SH,HZ
Jerry SH,CD,WH,HEB
# 建表语句:
use test;
create table complex_array(name string, city array<string>) ROW FORMAT delimited fields terminated by '\t' collection items terminated by ',';
# 上传文件
hdfs dfs -put 1.txt /user/hive/warehouse/test.db/complex_array
# 查看数据 select * from complex_array;
+---------------------+-------------------------+
| complex_array.name | complex_array.city |
+---------------------+-------------------------+
| Alex | ["BJ","JS","SH","HZ"] |
| Jerry | ["SH","CD","WH","HEB"] |
+---------------------+-------------------------+
#### 示例2.txt 数据:
1,Alex,唱歌:非常喜欢-跳舞:喜欢-游戏:一般般
2,Melin,自行车:非常喜欢-足球:不喜欢
# 建表语句
create table t_map(id int,name string,hobby map<string,string>) row format delimited fields terminated by ',' collection items terminated by '-' map keys terminated by ':';
# 上传文件
hdfs dfs -put 2.txt /user/hive/warehouse/test.db/t_map
# 查看数据 select * from t_map
+-----------+-------------+---------------------------------------------------+
| t_map.id | t_map.name | t_map.hobby |
+-----------+-------------+---------------------------------------------------+
| 1 | Alex | {"唱歌":"非常喜欢","跳舞":"喜欢","游戏":"一般般"} |
| 2 | Melin | {"自行车":"非常喜欢","足球":"不喜欢"} |
+-----------+-------------+---------------------------------------------------+
############################ 不指定分隔符时的默认分隔符
# 默认分隔符是'\001' 在vi下,Ctrl+v再Ctrl+a即可输入这个符号
# 示例数据 3.txt
1^A砖家^A28
2^A明月^A33
# 建表语句
create table t_t5(id int, name string, age int);
# 上传文件
hdfs dfs -put 3.txt /user/hive/warehouse/test.db/t_t5
# 查看数据 可以看到映射成功.