大数据之Hive

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结构

sql 复制代码
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; 查询表的详细信息

  2. 表的删除操作

    drop table table_name;
    truncate table table_name;清空表中数据,不能清空外部表

  3. 表的修改操作

    • 修改表名: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 '本地路径' (查询语句)
相关推荐
Edingbrugh.南空1 小时前
Flink自定义函数
大数据·flink
gaosushexiangji2 小时前
利用sCMOS科学相机测量激光散射强度
大数据·人工智能·数码相机·计算机视觉
无级程序员5 小时前
大数据平台之ranger与ldap集成,同步用户和组
大数据·hadoop
lifallen6 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
TDengine (老段)6 小时前
TDengine 数据库建模最佳实践
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
张先shen6 小时前
Elasticsearch RESTful API入门:全文搜索实战(Java版)
java·大数据·elasticsearch·搜索引擎·全文检索·restful
Elastic 中国社区官方博客6 小时前
Elasticsearch 字符串包含子字符串:高级查询技巧
大数据·数据库·elasticsearch·搜索引擎·全文检索·lucene
张先shen7 小时前
Elasticsearch RESTful API入门:全文搜索实战
java·大数据·elasticsearch·搜索引擎·全文检索·restful
天翼云开发者社区8 小时前
Doris-HDFS LOAD常见问题汇总(二)
大数据·doris
简婷187019987758 小时前
源网荷储 + 零碳园区:一场关于能源与未来的双向奔赴
大数据·人工智能·能源