一、什么叫做Hive
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据表,并提供简单的sql查询功能,可以将sql语句转化为MapReduce任务进行运行。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
二、安装Hive
1、apache-hive-1.2.2-bin.tar.gz使用WinSCP上传到node1的/usr/local目录下。
2、解压缩hive安装包:tar -zxvf apache-hive-1.2.2-bin.tar.gz。
3、重命名hive目录:mv apache-hive-1.2.2-bin hive
4、配置hive相关的环境变量
vi ~/.bashrc
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
运行
source .bashrc
三、安装部署MySql
1、在node1上安装mysql
2、使用yum安装mysql server
yum install -y mysql-server
systemctl restart mysqld
systemctl enable mysqld
3、使用yum安装mysql connector
yum install -y mysql-connector-java
4、将mysql connector拷贝到hive的lib包中
cp /usr/share/java/mysql-connector-java.jar /usr/local/hive/lib
5、在mysql上创建hive元数据库,并对hive用户进行授权
mysql
mysql>
create database if not exists hive_metadata;
grant all privileges on hive_metadata.* to 'hive'@'%' identified by 'hive';
grant all privileges on hive_metadata.* to 'hive'@'localhost' identified by 'hive';
grant all privileges on hive_metadata.* to 'hive'@'node10' identified by 'hive';
flush privileges;
use hive_metadata;
四、配置Hive XML
cd conf
mv hive-default.xml.template hive-site.xml
vi hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive_metadata?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<!-- 存储到hdfs -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
五、配置Hive sh文件
mv hive-env.sh.template hive-env.sh
mv hive-log4j.properties.template hive-log4j.properties
vi /usr/local/hive/bin/hive-config.sh
export JAVA_HOME=/usr/java/latest
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`
修改为:
sparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`
六、启动方式
nohup hive --service metastore > metastore.log 2>&1 &
启动web服务(端口9999) nohup hive --service hwi &
启动远程服务(端口10000) hive --service hiveserver2 & hive --service hiveserver 10000>/dev/null 2>/dev/null &
七、关于Hive的一些相关操作
1、创建数据库
create database mytest;
2、创建表
内部表(数据文件自动保存到hdfs:/user/hive/warehouse/表名,删除表时自动删除数据文件)
create table trade_detail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t';
3、分区表
create table td_part(id bigint, account string, income double, expenses double, time string) partitioned by (logdate string) row format delimited fields terminated by '\t';
4、外部表(引用外部的数据文件,删除表时不删除数据)
create external table td_ext(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t' location '/td_ext';
5、常见操作
展示所有表:hive> SHOW TABLES;
展示表中有多少分区:hive> show partitions logs;
显示表的结构信息hive> DESCRIBE invites;
显示所有函数:hive> show functions;
查看函数用法:hive> describe function substr;
更新表的名称:hive> ALTER TABLE source RENAME TO target;
添加新一列hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
从本地文件加载数据:hive> LOAD DATA LOCAL INPATH '/usr/local/trade_detail.txt' OVERWRITE INTO TABLE trade_detail;
从HDFS加载数据:hive> LOAD DATA INPATH '/data/trade_detail.txt' OVERWRITE INTO TABLE trade_detail;
加载分区表数据:hive> load data local inpath '/home/hadoop/input/hive/partitions/file1' into table logs partition (dt='2001-01-01',country='GB');
删除表:hive> DROP TABLE trade_detail;
删除表中数据,但要保持表的结构定义 hive> dfs -rmr /user/hive/warehouse/trade_detail;
6、java如何操作Hive
(1)依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.2</version>
</dependency>
启动hive远程服务
编程类似于JDBC
public static void main(String[] args) {
try {
//1.加载驱动类
Class.forName("org.apache.hive.jdbc.HiveDriver");
System.setProperty("HADOOP_USER_NAME", "root");
//2.创建连接
Connection conn = DriverManager.getConnection("jdbc:hive2://node10:10000/mytest", "", "");
Statement s = conn.createStatement();
s.execute("use mytest");
PreparedStatement ps = conn.prepareStatement("select * from trade_detail");
ResultSet rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("id") + "\t" + rs.getString("account") + "\t" + rs.getDouble("income") + "\t" + rs.getDouble("expenses") + "\t" +rs.getString("time"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
八、自定义函数
1、编程
public class BalanceUDF extends UDF {
public String evaluate(Double income, Double expenses) {
if(income > expenses) {
return "盈余";
} else if(income == expenses) {
return "持平";
} else {
return "透支";
}
}
}
2、加载jar到类路径
将函数类导出到jar文件
hive> add jar /usr/local/hive-udf.jar;
创建函数
create temporary function <函数名> as 'java类名';
使用函数
select <函数名>(参数);
删除函数
drop temporary function <函数名>;
删除jar从类路径
hive> delete jar /usr/local/hive-udf.jar;
八、单词计数
在hive中创建一个textline的表
create table textlines(text string);
在hive中创建一个words表
create table words(word string);
加载数据到textlines中
load data inpath '/data/a.txt' into table textlines;
将textlines中的数据拆分根据','号拆分为单词,炸开为多条记录存入words表中
insert overwrite table words select explode(split(text,' ')) as word from textlines;
进行单词统计
select word, count(*) from words group by word;