大数据之Hive

2023-09-15 16:46:03

Hive入门

Hive是FaceBook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据映射为一张表,并提供类SQL查询功能。

  1. 结构化数据是指没有表名和列名的数据文件,映射为一张表就是给这个数据添加表名和列名,让开发人员后续实现需求时只需使用类似SQL的代码来查询数据。

  2. Hive本质是一个Hadoop客户端,将HQL转化成MapReduce程序。底层都是hadoop实现的,Hive的主要工作有点类似编译器。

  3. Hive架构原理

    • 解析:检查语法是否正确,表名列名是否存在
    • 编译:将执行SQL代码的步骤列处理,生成逻辑计划
    • 优化:将执行步骤优化,降低去除冗余操作,生成物理计划
    • 执行:执行物理计划,即底层的MR操作
  4. 特点:执行延迟比较高,只支持追加写,不能实现update和delete.

  5. Hive和数据库的比较:

    • Hive达到PB级别,mysql单表一般百万左右
    • Hive计算引擎是MapReduce/spark, MySQL引擎是InnoDB
    • Hive执行延迟高,MySQL执行延迟低
  6. 官网地址:hive.apache.org

安装Hive

  1. 修改core-site.xml,允许其他主机登录连接
  2. 打开端口号为10000的连接服务hive servervice2
    • vim conf/hive-site.xml
    • hive --service hiveservice2
    • 当前窗口会停止在当前界面
  3. 从datagrip中连接,由于自己是在window环境中,使用atguigu登录,这个身份是造假的,hadoop无法核实,必须在第一步开放权限才行。
  4. 也可以使用hive/bin目录下的beeline命令来连接hive。进入后可以使用!quit退出。

metastore独立服务模式

各个主机不直接连接MySQL数据,先连接metastore数据库,在metastore服务来设置账号密码,增加安全性,降低MySQL服务器的压力。

  1. hive-site.xml文件中添加指定metastore服务的地址
  2. 启动该独立服务hive --servie metastore
  3. 再启动hive --service hiveservice2

目前来说,这些服务进程都是前台进程,不是很安全,希望变成后台进程,自己运行。

编写hive启动脚本

脚本命令解析:

  1. nohup: 将前台进程输出的内容输入当当前路径的nohup.out文件中,关闭终端进程也继续保持运行状态
  2. nohup hive --service hiveserver2 & : 打印pid, 并且变成后台进程
  3. 符号含义
    • > 覆盖写
    • >> 追加写
    • >& 合并
  4. linux系统的三种流
    • 标准输入流: 键盘输入 代表数字为0
    • 标准正确输出流: 控制台输出 代表数字为1
    • 标准错误输出流:控制台输出 代表数字为2
  5. 2>&1:将报错的日志和正常的日志合并到一起
  6. /dev/null 黑洞,执行代码但是不打印输出结果
  7. grep -v 参数 :过滤掉结果中带有参数的。grep -i 参数,过滤时忽略大小写
  8. awk 按照空格切割时会忽略无效值, awk -F 按照自定义的进行分割
  9. - z 参数 : 判断参数是否存在

Hive的两个常用调用

  1. hive -e 命令行输入SQL命令
  2. hive -f 文件输入SQL命令

Hive日志参数配置方式

  1. 查看:进入hive后,使用set;命令查看
  2. 修改:
    • 修改hive-site.xml文件
    • 命令行:hive --hiveconf 参数值 = 修改值; 修改的值是临时且独立的
    • 进入hive: set mapreduce.job.reduces=10;
  3. set 参数名; :查看参数

其他参数配置

  1. 显示表名和库名: header
  2. 修改日志存放路径:vim hive/conf/hive-log4j2.properties
  3. 修改hive申请的内存大小 vim hive-env.sh. 打开HADOOP_HEAPSIZE=2048

使用Hive的map和struct结构

create table tch(
    name string,                    --姓名
    friends array<string>,        --朋友
    students map<string, int>,   --学生
    address struct<street:string,city:string,email:int> --地址
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';

MySQL和Hive类型转换的区别

  1. 转换方向:
    • mysql:字符串向int进行转换
    • hive:字符串向double进行转换
  2. 转换失败时:
    • mysql: 结果变成0
    • hive:结果变成null

Hive语法

DDL数据定义语言

数据库操作

  1. 数据库增加操作

    • create database [if not exists] database_name: 创建库
      • 默认路径在/user/hive/warehouse
      • 库文件夹有.db后缀
  2. 数据库查询操作

    • show databases; 打印所有的库
    • show databases like ‘db_hive*’
    • desc database extended database_name: 查看库的信息和注释
  3. 数据库删除操作

    • drop database database_name; 删除空库
    • drop database database_name cascade; 删除非空库
  4. 数据库修改操作

    • alter database databasename set dbproperties(‘xx’ = ‘bbb’);
    • 其他属性无法修改,可以在MySQL中进行修改,但是不建议修改

表的操作

内部表(管理表)
  1. 表的创建
    • create table table_name(属性名, 属性类型...)
    • external 在table字段添加,表示为外部表
    • partitioned by 分区表
    • clustered by 分桶表
    • sorted by into n buckets: 桶内排序字段和分成几个桶
    • row format row_format 行分隔符默认值
      • FIELDS TERMINATED BY char字段分割符号 ^A ctrl+v ctrl+a
      • 集合元素分隔符 ^B ctrl+v ctrl+b
      • map元素分割符 ^C ctrl+v ctrl+c
      • 行分割符 ‘\n’
    • 表对应的文件存储格式 textfile
    • LOCATION 表对应的hdfs路径
    • TBLPROPERTIES(property_name=property_value,..)表的属性
  2. 根据查询结果创建一张表,不带原表的分隔符create table if not exists student2 as select id, name from student;
  3. 根据表结构创建表,带表的分隔符create table if not exists student3 like student;
外部表

外部表删除时只会删除hive中的元数据,不会删除HDFS中的文件。而内部表删除时会将元数据和HDFS中的文件信息一并删除。在公司中大部分都是外部表,内部表一般用于测试和中间表。

如何区分内部表和外部表?
desc formatted table_name 查看表的类型区分内外部表
是否可以将内部表转换为外部表?
alter table tablename set tblproterties('EXTERNAL' = 'TRUE'); 外部表
alter table tablename set tblproterties('EXTERNAL' = 'FALSE'); 内部表

  1. 表的查询操作
show tables; 查询所有表
desc table; 查询表的粗略信息
desc formatted table; 查询表的详细信息
  1. 表的删除操作
drop table table_name; 
truncate table table_name;清空表中数据,不能清空外部表
  1. 表的修改操作
    • 修改表名:alter table old_name rename to new_name;
    • 修改列名:alter table_name change id ids int;
    • 增加列:alter table table_name add columns(…);
    • 替换列:alter table table_name replace columns(…);

DML数据操作语言

数据导入

  1. 向表中装载数据Load
    • load data [local] inpath '数据的path' [overwrite] into table table_name [partition (partcol1=val1,…)];
  2. 根据查询结果插入数据,插入的数据列数必须和被插入表一样。
    • insert into table student (查询语句) :追加写
    • insert overwrite student (查询语句):覆盖写

数据导出insert

  1. 导出到本地:insert overwrite local director ‘本地路径’ (查询语句),分隔符是默认的,可以进行指定分隔符
  2. 导出到HDFS系统中,insert overwrite director ‘本地路径’ (查询语句)
更多推荐

小白带你学习ceph分布式存储

目录一、概述1、分布式存储系统2、特点2、1统一存储2、2高扩展性2、3可靠性强2、4高性能二、组件1.Monitor2.OSD3.MDS4.Object5.PG6.RADOS7.Libradio8.CRUSH9.RBD10.RGW11.CephFS三、架构图1、文件上传2、文件存储前四、部署1、环境拓扑2、准备工作3

【Robotframework+python】实现http接口自动化测试

前言下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了bug,所以需要一遍遍回归case,过程一直手工去执行,苦不堪言。所以,对于即将开始的http接口测试需求,立马花了两天时

Openresty(二十二)ngx.balance和balance_by_lua终结篇

一灰度发布铺垫①init_by_lua*init_by_luainit_by_lua_block特点:在openresty'start'、'reload'、'restart'时执行,属于'masterinit'阶段机制:nginx'master'主进程'加载配置文件'时,运行全局LuaVM级别上的参数指定的'Lua代码

操作系统备考学习 day4 (2.1.7 - 2.2.4)

操作系统备考学习day4二、进程与线程2.1进程与线程2.1.7线程的状态与转换2.2处理机调度2.2.1调度的概念、层次2.2.2进程调度的时机切换与过程调度的方式2.2.3调度器、闲逛进程2.2.4调度算法的评价指标二、进程与线程2.1进程与线程2.1.7线程的状态与转换线程的状态与转换线程的组织与控制2.2处理机

使用亚马逊云服务器在 G4 实例上运行 Android 应用程序

随着Android应用程序和游戏变得越来越丰富,其中有些甚至比PC上的软件更易于使用和娱乐,因此许多人希望能够在云上运行Android游戏或应用程序,而在EC2实例上运行Android的解决方案可以让开发人员更轻松地测试和运行Android应用程序。在这篇博客文章中,我们将展示如何使用NICEDCV在Anbox中运行A

【JDK 8-Lambda】3.1 Java高级核心玩转 JDK8 Lambda 表达式

一、什么是函数式编程?二、什么是lambda表达式?1.先看两个示例A.【创建线程】B.【数组排序-降序】2.lambda表达式特性A.使用场景(前提):B.语法(params)->expressionC.参数列表D.方法体F.好处一、什么是函数式编程?将一个函数(也称“行为”)作为一个参数进行传递面向对象编程是对数据

【Redis】Redis 的学习教程(十一)之使用 Redis 实现分布式锁

1.分布式锁概念在多线程环境下,为了保证数据的线程安全,锁保证同一时刻,只有一个可以访问和更新共享数据。在单机系统我们可以使用synchronized锁、Lock锁保证线程安全。synchronized锁是Java提供的一种内置锁,在单个JVM进程中提供线程之间的锁定机制,控制多线程并发。只适用于单机环境下的并发控制。

解决Nacos配置刷新导致定时器停止执行的问题

1.问题描述我使用了一个定时器类来执行某个任务,并且使用Nacos作为配置中心来管理定时器的配置。我发现当Nacos配置发生变化时,定时器实例会停止执行任务,导致任务无法按预期执行。2.原先的实现方式以下是我原先的代码实现方式:@Component@RefreshScope@RequiredArgsConstructo

英飞凌TC3xx--深度手撕HSM安全启动(四)--TC3xx HSM使能和配置技巧

上一章,我们简单聊了下英飞凌TC3xx的HSM的系统框架、相关UCB、Host和HSM通信模块。今天着重分析HSM的使能。1.系统引入HSM的思考为什么要增加HSM信息安全方面考虑,系统的安全启动、ECU之间安全数据的交互、ECU内部的敏感信息保存TC3xx使能HSM后,HSM的代码应该存放在哪里?在上一章,我们了解到

C++的移动构造和移动赋值运算符

右值引用右值引用(rvaluereferences)是一种新的用于绑定右值的引用类型。那么什么是右值?右值通常是编译器生成的用于表达式计算的临时变量或常量。目前来说,我们还不能安全地使用引用变量来绑定右值。从编译原理上讲,右值是只存在于表达式计算时的未命名值。下面这一表达式产生了一个右值:x+(y*z);//AC++e

SpringBoot携带Jre绿色部署项目_免安装Jdk[Linux服务器]

文章目录SpringBoot携带Jre绿色部署项目[Linux服务器]1.实现步骤2.自测成功,如下2-1环境准备2-2运行项目SpringBoot携带Jre绿色部署项目[Linux服务器]说明:实际应用的不方便场景:1.实际项目部属时,现有服务器可能已安装有Jdk,和自己项目的Jdk版本不一致,不敢轻易安装自己使用的

热文推荐