数据学习从0到1 Apache Hive基础

152 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天 juejin.cn/post/716729…

使用方式

  1. 命令行

  2. JDBC

命令行

  1. bin/hive 最基础的使用方式

  2. beeline:官方推荐的轻量级客户端工具

hive

在hive目录下 bin/hive进入

简单测试下

show tables;

create table t1(id int,name string);

添加数据

insert into t1(id,name) values(1,"zs");

这里执行时会产生mapReduce任务

查询表数据

select * from t1;

查询时并没有产生mapReduce任务,针对select * from tableName这种操作,就跟我们在hdfs打开文件一样,不需要调用计算引擎,所以也就没有产生mapReduce任务。

删除表测试

drop table if exists t1;

退出

quit;

beeline

首先启动HiveServer2服务

bin/hiveserver2

这里必须要等待Hive2服务启动后再通过beeline去连接

等待Hive2输出完所有的Session ID 信息

一般是四行

hiveserver2默认会监听本机的10000端口

重新打开一个新的session会话

启动beeline

bin/beeline -u jdbc:hive2://localhost:10000

上述操作再来一遍

create table t1(id int,name string);

这里报错信息提示缺少写权限

先退出beeline,用root用户启动

bin/beeline -u jdbc:hive2://localhost:10000 -n root

再来一遍

create table t1(id int,name string);

select * from t1;

可以看到beeline会对一些信息进行封装,显得更加好看和专业

官方推荐使用beeline,这个看个人喜好。

hive -e 执行hql语句

首先知道hive -e无需启动会话,就可以执行hive命令

测试如下

配置hive环境变量

vi /etc/profile

export HIVE_HOME=/data/soft/apache-hive-3.1.2-bin

source /etc/profile

JDBC方式

这里我们创建一个maven项目

com.bigdata.hive

添加Hive开发依赖

hive JDBC驱动如下

org.apache.hive

hive-jdbc

3.1.2

核心代码:

先启动hiveserver2服务

/**

  • JDBC代码操作 Hive

*/

public class HiveJdbcDemo {

public static void main(String[] args) throws Exception{

//指定hiveserver2的连接

String jdbcUrl = "jdbc:hive2://192.168.197.104:10000";

//获取jdbc连接,这里的user使用root,就是linux中的用户名,password随便指定即

Connection conn = DriverManager.getConnection(jdbcUrl, "root", "any")

//获取Statement

Statement stmt = conn.createStatement();

//指定查询的sql

String sql = "select * from t1";

//执行sql

ResultSet res = stmt.executeQuery(sql);

//循环读取结果

while (res.next()){

System.out.println(res.getInt("id")+"\t"+res.getString("name"));

}

}

}

这里处理下log4j的信息

排除hive自带的log4j

  

   org.apache.hive

   hive-jdbc

   3.1.2

   

    

     org.slf4j

     slf4j-log4j12

    

   

  

资源目录下新增log4j.xml

重新打印,即可解决log4j报错信息问题

使用临时参数

在hive命令行中可以使用set命令临时设置一些参数的值

其实就是临时修改hive-site.xml中参数的值

通过set命令设置的参数只在当前会话有效,退出重新打开就无效了

hive-site.xml中有一个参数是 hive.cli.print.current.db ,这个参数可以显示当前所在的数据库名 称,默认值为 false 。 在这里我们设置为true。

set hive.cli.print.current.db = true;

还有一个参数 hive.cli.print.header 可以控制获取结果的时候显示字段名称,这样看起来会比较清晰

set hive.cli.print.header = true;

修改 ~/.hiverc,保留配置仅对当前用户生效

vi ~/.hiverc

set hive.cli.print.current.db = true;

set hive.cli.print.header = true;

重新进入看下效果

配置Hive日志

删除重复的日志信息

hive中的一个日志依赖包和hadoop中的日志依赖包冲突

我们移除hive的日志依赖包

mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak

配置Hive日志信息目录

mv hive-log4j2.properties.template hive-log4j2.properties

vi hive-log4j2.properties

配置信息如下

property.hive.log.level = WARN

property.hive.root.logger = DRFA

property.hive.log.dir = /data/hive_repo/log

property.hive.log.file = hive.log

property.hive.perflogger.log.level = INFO

这样后期分析日志就可以到 /data/hive_repo/log 目录下去查看了。