大数据之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';

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 ‘本地路径’ (查询语句)

你可能感兴趣的:(大数据,hive,hadoop)