首页 > 其他分享 >Hive基础使用

Hive基础使用

时间:2023-05-31 17:55:04浏览次数:29  
标签:使用 基础 hive Hive sql 日志 root

Hive的使用方式

可以在Shell命令行下操作Hive,或者使用JDBC代码的方式操作

命令行方式

针对命令行这种方式,其实还有两种使用

  • 第一个是使用bin目录下的hive命令,这个是从hive一开始就支持的使用方式
  • 后来又出现一个beeline命令,它是通过HiveServer2服务连接hive,是一个轻量级的客户端工具,所以后来官方开始推荐使用这个。

具体使用哪个属于个人的一个习惯问题,特别是一些做了很多年大数据开发的人,已经习惯了使用hive命令,如果使用beeline会感觉有点别扭

针对我们写的hive sql通过哪一种客户端去执行结果都是一样的,没有任何区别,所以在这里我们使用哪个就无所谓了。

第一种方式: hive

bin/hive

下面出现以hive开头的内容就是说明我们进入了Hive的命令行中,在这里就可以写Hive的SQL了

show databases; # 默认使用default
show tables; # 默认为空
create table tb_user(id int,name string); # 创建一个表,此时就会向hdfs中创建一个目录

image

向表里面添加数据,注意,此时就产生了MapReduce任务

insert into tb_user(id,name) values(1,"李四");

hdfs中也会创建一个文件,内容就是表的数据

image

查询数据,为什么这时没有产生mapreduce任务呢?因为这个计算太简单了,不需要经过mapreduce任务就可以获取到结果,直接读取表对应的数据文件就可以了。

注意,表数据是不支持更新和删除的,只能新增。

可以输入quit退出hive的命令行,或者直接按ctrl+c也可以

第二种方式: beeline

先启动hiveserver2服务

bin/hiveserver2

注意了,启动hiveserver2服务之后,最下面会输出几行Hive Session ID的信息,一定要等到输出4行以后再使用beeline去连接,否则会提示连接拒绝

hiveserver2默认会监听本机的10000端口,所以命令是这样的

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

创建表报错,提示匿名用户对hdfs目录/user/hive/warehouse没有写权限,解决方法有两个

  1. 给hdfs中的/user/hive/warehouse设置777权限,让匿名用户具备权限 hdfs dfs -chmod -R 777 /user/hive/warehouse
  2. 在启动beeline的时候指定一个对这个目录有操作权限的用户 bin/beeline -u jdbc:hive2://localhost:10000 -n root

这里我们使用第二种。

如果我们没有处理权限的问题,在向表新增数据时,会报以下错误

Error: Error while compiling statement: FAILED: SemanticException 0:0 Expected 2 columns for insclause-0/default@tb_user; select produces 1 columns. Error encountered near token ''zs'' (state=42000,code=40000)

在工作中我们如果遇到了每天都需要执行的命令,那我肯定想要把具体的执行sql写到脚本中去执行,但是现在这种用法每次都需要开启一个会话,好像还没办法把命令写到脚本中。

注意了,hive后面可以使用 -e 命令,这样这条hive命令就可以放到脚本中定时调度执行了。因为这样每次hive都会开启一个新的会话,执行完毕以后再关闭这个会话。当然了beeline也可以,后面也是跟一个-e参数。

JDBC方式

JDBC这种方式也需要连接hiveserver2服务,前面我们已经启动了hiveserver2服务,在这里直接使用就可以了

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>3.1.2</version>
</dependency>
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 测试通过jdbc操作hive,如果提示连接被拒绝,那可能是hiveserver2服务没启动
 */
public class TestHiveJdbc {
    public static void main(String[] args) throws SQLException {
        //指定hiveserver2的连接
        String jdbcUrl = "jdbc:hive2://ip:10000";
        //获取jdbc连接,这里的user使用root,就是linux中的用户名,password随便指定即可
        Connection conn = DriverManager.getConnection(jdbcUrl, "root", "any");
        //获取Statement
        Statement stmt = conn.createStatement();
        //指定查询的sql
        String sql = "select * from tb_user";
        //执行sql
        ResultSet res = stmt.executeQuery(sql);
        //循环读取结果
        while (res.next()) {
            System.out.println(res.getInt("id") + "\t" + res.getString("name"));
        }
    }
}

Set命令的使用

在hive命令行中可以使用set命令临时设置一些参数的值,其实就是临时修改hive-site.xml中参数的值

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

如果想要对当前机器上的当前用户有效的话可以把命令配置在 ~/.hiverc文件中

  • 使用set命令配置的参数是当前会话有效
  • 在~/.hiverc文件中配置的是当前机器中的当前用户有效
  • 而在hive-site.xml中配置的则是永久有效了

.hiverc文件格式

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

Hive的日志配置

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/root/test_hive/hive3.1.2/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/root/test_hadoop/hadoop3.2/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

我们每次进入hive命令行的时候都会出现这么几行日志,想要去掉,怎么办呢?
通过分析日志可知,是有重复的日志依赖,所以需要删除一个,
这里是hive中的一个日志依赖包和hadoop中的日志依赖包冲入了,那我们只能去掉Hive的了,因为hadoop是共用的,尽量不要删它里面的东西。为了保险起见,我们可以使用mv给这个日志依赖包重命名,这样它就不生效了

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

还有就是当我们遇到Hive执行发生错误的时候,我们要学会去查看Hive的日志信息,通过日志的提示来分析,找到错误的根源,帮助我们及时解决错误。

那我们在哪里查看Hive日志呢,我们可以通过配置文件来找到默认日志文件所在的位置。在hive的conf目录下有一些log4j的模板配置文件,我们需要去修改一下,让它生效。

首先是 hive-log4j2.properties.template 这个文件,去掉 .template 后缀,
修改里面的 property.hive.log.level 和 property.hive.log.dir 参数

property.hive.log.level = WARN
property.hive.root.logger = DRFA
property.hive.log.dir = /root/test_hive/log
property.hive.log.file = hive.log

hive-exec-log4j2.properties.template也是同样的处理。

这样后面分析日志就可以到 /root/test_hive/log 目录下去查看了。

标签:使用,基础,hive,Hive,sql,日志,root
From: https://www.cnblogs.com/strongmore/p/17342599.html

相关文章

  • Windows通过使用批处理.bat脚本文件修改DNS值
    在公司内网有自己的DNS服务器,但是在使用某些软件时又经常需要特定的DNS地址,每次切换都非常麻烦,所以写了个.bat批处理脚本文件方便切换,如果是修改IP等信息做些修改后同样可以使用。@echooff:startecho1:设置DNS为手动2:设置DNS为自动set/pvar=请选择if%var%==1gotoop......
  • GMSSL国密库使用
    生成SM2密钥对及CER证书#生成SM2密钥对,注意记住密钥文件密码gmsslsm2-genkey-outarbboter/test.pem#查看密钥文件,要输入密钥文件密码gmsslec-inarbboter/test.pem-text#根据SM2密钥文件生成证书,要输入密钥文,证书信息gmsslreq-new-x509-keyarbboter/test.p......
  • HTML基础学习
    1.HTML表单元素的使用<!doctypehtml><html><head><title>NEFU</title></head><body><center><h2><fontcolor="blue">中国百度</font></h2> <ahref="http://www.......
  • Eexcel中使用PowerQuery更新数据到超级表
    记一次PowerQuery使用流程需求:1、超级表共有9列2、PowerQuery查询到的数据共有3列3、其中超级表中6列需要使用Excel函数从其他表关联操作流程:1、首先PowerQuery查询完数据后绑定到超级表2、在超级表中直接添加列并修改表头3、使用Excel函数从其他......
  • 不使用microlib实现STM32串口printf重定向:
    不使用microlib实现STM32串口printf重定向:突然发现有一篇markdown忘记上传了,补一下注:使用的是CubeMX生成的工程文件生成后,在usart.c中添加如下代码://usercodebegin0typedefstruct__FILEFILE;struct__FILE{ inthandle;};FILE__stdout;//userco......
  • oracle 最大IOPS使用率和IOMBPS使用率监控 19c
    pdb最大iops使用率监控指标获取通过字典DBA_HIST_RSRC_PDB_METRIC分析具体字段为IOPS_THROTTLE_EXEMPT、IOMBPS_THROTTLE_EXEMPT一般最大值超过5就要告警了参数iops_throttle_exempt IndicateshowmuchoftheI/OpersecondinthecurrentPDBwasexemptedfromt......
  • Python基础之函数的参数以及名称空间
    函数的参数形式参数什么是形式参数:在'函数定义阶段'括号内依次写入的变量名就叫形式参数,简称"形参" defindex(a,b,c,d,e):pass#a,b就称之为是函数的形参1、位置形参位置形参 在函数'定义阶段'括号内从'左往右依次'写入的'变量名'就是位置形参......
  • Python基础之装饰器
    装饰器1、为什么要用装饰器1.1、为程序提供扩展功能的可能性1.2、要遵循开放封闭原则1.3、禁止修改原代码,但是可以新增功能1.4、也不能修改调用方式2、什么是装饰器2.1为被装饰对象添加新功能的工具2.2、不修改被装饰对象源代码和调用方式3、装饰器的核心思想3......
  • python基础15
    递归函数什么是递归函数递归就是直接或者间接调用自己的函数就是递归函数1#练习题2l=[1,[2,[3,[4,[5,[6,[7,[8]]]]]]]34defindex(l):5foriinl:6iftype(i)isint:7print(i)8else:9index(i)算法之......
  • git 使用ssh连接Github:017
    1.首先打开GitBash终端,生成私钥和公钥:ssh-kengen第一步提示:生成的密钥你要放在哪里?这里有给出默认地址,当然你也可以自己设置一个地址,如果不设置,直接回车就行 第二步提示:你要不要给你当前的密钥去设置一个密码?其实这一步没必要去设置,回车就行 第三步提示:提示你输入确认......