hive为用户提供了多种使用方式,包括本地客户端交互、将hive作为服务从远程通过客户端交互以及脚本化运行方式(常用)
一、基本运行方式
hive是一个单机程序,在安装hive的机器上,执行 hive 启动hive进入hive交互界面(如果没有配置path变量,需要到hive的安装目录下运行bin中hive程序)。
进入交互界面后就可以执行各种对库、表的增删改查
二、将hive启动为服务
启动hive服务,监听10000端口,就不需要必须在安装hive的服务器上进行,可以在任意可以与hive服务通信的机器上启动hive客户端—beeline与hive服务器交互。
hive在$hive_home/bin下提供了hiveserver2程序用于启动hive服务,提供beeline程序作为客户端。
step1.启动hive服务
在安装hive服务的机器上执行 hiveserver2 就可以启动服务(如果没有配置环境变量直接到安装目录下执行),一般会在后台静默运行。
nohup hiveserver2 1>/dev/null 2>&1 &
step2.在可以与hi v额服务器通信的机器上执行 beeline 进入beeline的交互界面
!connect jdbc:hive2://hdp-01:1000
输入HDFS用户名、密码。这样完成连接,可以通过交互在hive服务器上执行。
step3.交互执行操作
#关闭连接
!close
#退出beeline,服务会继续运行,只能到hive服务器关闭
!quit
三、脚本化运行(常用)
使用一次性命令的方式来执行给定的hql语句。
方式1、hive -e “要执行语句”
这样的方式,可以不需要进入hive交互式界面,直接使用shell命令输入 hive -e "select * from student" 来进行查询等操作。
在这样的基础上就可以写一个.sh脚本来写入多条hive -e命令,然后执行sh文件
方式2、hive -f test.hql
还可以把hql语句直接写到脚本中(不需要写hive -e),把文件保存为 .hql 格式,通过执行 hive -f test.hql 来执行hql语句。
四、通过JDBC访问hive
0、导包
maven官方查询hive依赖
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>2.1.0</version> </dependency>
1、注册、连接、查询
package com.jing.hadoop; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** * 使用jdbc方式连接到hive数据仓库,hive需要开启hive server2服务 * */ public class App { public static void main( String[] args ) throws Exception{ //加载hive jdbc驱动,并注册到DriverManager Class.forName("org.apache.hive.jdbc.HiveDriver"); //获得数据库连接 Connection conn = DriverManager.getConnection("jdbc:hive2//192.168.1.236:10000/mydb2"); // Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select id, name, age from t"); while(rs.next()){ System.out.println(rs.getInt((1)) + "," + rs.getString(2)); } rs.close(); st.close(); conn.close(); } }
hive建库建表导入数据
1、建库、建表(以基本运行方式为例)
show databases; create database hive_test; create table student(id int, name string);
这样操作之后会在hdfs上创建目录,,,/usr/hive/warehouse
把文件放到student目录下,在hive上的表现就是表内有数据了。表内各字段的值就是文件内一行记录被分割之后的值。
注意:hive切字段时默认使用的分隔符是 01,所以创建的文件中,字段之间使用^A分割(我在使用的时候不好使,未查到问题出在哪里)。支持自定义用于分割的字符。
create table t_order(id string,create_time string,amount float,uid string) row format delimited fields terminated by ',';
2、根据模板表创建表:
创建的表不包含数据
create table table-name like table-2-name
创建的表包含数据:
create table as select * from table-2
2、导入数据
load data local inpath ‘/local/path’ into table t_name partition(singal='singal_value');
(注意这里的local是对hive服务器而言的)
load data inpath ‘/hdfs/path’ into table t_name partition(singal='singal_value');
从本地导入和hdfs导入的区别:本地文件导入是复制,hdfs导入是移动