• 大数据之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结构

    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';
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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
    • 2
    • 3
    1. 表的删除操作
    drop table table_name; 
    truncate table table_name;清空表中数据,不能清空外部表
    
    • 1
    • 2
    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 ‘本地路径’ (查询语句)
  • 相关阅读:
    推荐系统 学习笔记
    计算机毕业设计(附源码)python职业学校招生系统
    pandas:jupyter notebook笔记(更新中)
    vue转electron项目以及使用fs报错:Module not found: Error: Can‘t resolve ‘fs‘ in解决办法
    typora使用picgo拖拽复制自动上传到chevereto私有图床(mac版)
    【系统设计】邻近服务
    plsql连接oracle数据库
    [NPUCTF2020]ReadlezPHP 1
    推荐一个支持低代码开发的OA开源系统
    携职教育:人社局通知:取得初级会计证可以申领补贴!至高1500元!
  • 原文地址:https://blog.csdn.net/qq_44273739/article/details/132853193