Hive的数据定义与数据操作

  • Hive的数据定义

  • Hive的数据仓库

  • Hive中的表

  • Hive中的数据类型

  • Hive中表的类型

  • Hive的数据操作

1.  Hive的数据定义

  HQL是一种SQL方言,支持绝大部分SQL-92标准,并对其做了一些扩展,并且仍然存在新的差异:不支持行级的操作,不支持事务等,从语法上讲,HQL最接近MySQL的方言,操作HIve的时候注意HQL与SQL的区别。

2  Hive中的数据库

  Hive中的数据库本质上仅仅是个表的目录或者命名空间。在生产环境中,如果表非常多的话,一般会用数据库讲生成表组织成逻辑组。但实际情况中,用户一般没有指定数据库,用的是默认的default数据库。数据库目录的名字都是以  .db结尾

  Hive会为每个创建的数据库在HDFS上创建一个目录,该数据库中的表会以子目录的形式存储,表中的数据会以表目录下的文件形式存储,如果用户使用的是默认的default数据库,该数据库本身没有自己的目录。数据库所在目录在:hive-site.xml文件的配置项hive.metastore.wareshuse.dir配置的目录之后,默认是:/user/hive/warehouse:

  1.使用create database 库名   来创建数据库(如果存在将抛出错误信息)

  推荐使用:drop  database if exists 库名(判断是否存在)

 

 

   2. 查看已存在的数据库

      • show  databases ;
      • show databases like '库名'    模糊查询
      • desc databases(table)  extended 库(表) ; 详细查询

  3.和MySQL一样,可以切换库:use  库名;

  4.删除某个数据库时:drop  database 库名;

3  .Hive中的表

  1.查看当前数据库下的表:show tables;或者show tables in 库名;

  2.创建表:

 

 

  1.   如果用户加上:if  not  exists,那么当该表存在时Hive会忽略掉后面的命令,但不会做出任何提示,
  2.  如果用户当前的数据库非目标数据库,需要指定数据库才能以上操作;hive>use  库名
  3.  可以对表的字段和表添加注释,在需要添加注释的字段后面加上:"COMMENT.."
  4.     需要在表的最后指定截取方式:row format delimited fields terminated by '截取方式';
  5.     查看表级别的注释,则需要使用:
    1. desc extended  表名;
    2. desc format 表名;
  6. 可以使用:row format delimited ,stored as 的字句指定行列的数据格式和文件存储格式,也可省略不写
  7. location字句可以指定该表的存储位置,如果不写,将会存储在默认的数据仓库目录,
  8. 复制表:
    1.  create  table 新表名  like  老表名;(只复制表结构复制数据)
    2.     create table  新表名    row  format delimited fields terminated by ' ' (截取方式)  as   select  *  from   老表;(查询语句)

4.  Hive中的数据类型

  1.基础数据类型:

  TINYINT  SMALLINT  INT  BIGINT  BOOLEAN  DOUBLE  STRING                         TIMESTAMP  DECIMAL  CHAR  VARCHAR  DATA  

 

 

 

  2.复杂数据类型:

  ARRAY  MAP  STRUCT  UNION  这些复杂数据类型都是由基本类型组成。

  • ARRAY
    • 定义方式:字段名    array<数据类型>
    • ARRAY类型是由一系列相同数据类型元素组成,这些元素可以通过下标来访问。
    • 截取方式:collection items  terminated by '截取方式';
  • MAP
    • 定义方式:字段名   map<字段名   数据类型,....>
    • Map包含key-value,我们可以通过key来访问元素
    • 截取方式:map  keys  terminated by '截取方式';
  • STRUCT
    • 定义方式:字段名   struct<字段名   数据类型......>
    • struct可以包含不同的数据类型的元素,可以通过  “点语法” 的方式来获取所需元素比如user是一个struct类型,可以通过user.address得到这个用户的地址。

5.·  Hive中表的类型

  1. 管理表
    •  在创建表的时候如果没有特别指定的话,都是所谓的管理表,也叫内部表,表管理意味着由Hive负责管理表的数据,hive默认会将数据保存到数据仓库目录下,当删除管理表时,hive会将表的数据还有元数据删除。
  2. 外部表
    • 如果当一份数据需要被多种工具分析时,如:hive,pig。意味着这份数据的所有权并不由hive拥有,这个时候可以创建一个外部效(External  table)来保存数据;如下:
    • 关键字:External  指明该表为外部表,而location 字句指明了数据存放的位置
    • 当需要删除外部表时,Hive会认为没有完全拥有这份数据,所以Hive只会删除该外部表的元数据信息而不会删除该表的信息
  3. 分区表
    • Hive可以支持进行分区(partition),分区可以将表进行水平切分,讲表数据按照某指定规则进行存。
    • 效果如下所示:

    • 无论是管理表还是外部表,一旦给表存在分区,那么数据在加载时后必须进入指定分区中:

      • load data inpath '路径' into table 表名 partition(分区字段 = 值);
  4. 删除表(和sql一样)
    • drop  table  表名;
    • drop table  if  exists 表名;
  5. 修改表
    • 在Hive中,可以使用alter  table  表名;来修改表属性,仅仅修改表的元数据,不会修改表本身数据。,所以一定要保证表的数据和修改后的元数据模式要匹配,否则数据将不可用。
    1. 表重命名
      • alter  table  老   rename  to    新名;
    2. 增加分区(通常都是外部表)
      • alter  table 表名  add  partition(字段名=值)
      • alter table 表名 add partition (分区字段   =  '值') (分区字段   =  '值'); 空格隔开
    3. 修改分区路径
      • alter  table  表名  partition(字段名=值)  set  location '路径';
    4. 删除分区
      • alter table 表名  drop  partition (字段名=值)
    5. 修改表的属性(内部表和外部表的相互转换)
      • alter table 表名  set tblproperties('WXTERNAL'='TRUE');
    6. 修改列信息
      • alter table  表  chang  column  老列   新列   数据类型;
    7. 增加列
      • alter  table  表名  add columns  新列名   数据类型
    8. 删除或者换列
      • alter table 表名  replace colums 新列名   数据类型

 

6.  Hive的数据操作

  在创建完表之后,就应该对表中的数据进行相关操作,但是Hive不支持行级别的删改,也就是传统关系型数据库中的updata,delete操作时不支持的,支持的只有转载数据,导出数据和查询数据操作;

  1. 装载数据,在Hive中转载数据可以理解为传统数据库中的添加数据,但原理不同,Hive总有五种装载数据的方式;
    1. hdfs上传:hadoop fs -put 文件  路径;
    2. load data local(本地) inpath '路径' into  table 表名;
    3. 覆盖现有的表
      • load data local inpath '路径' overwrite into table  表名;
      • 如果是分区表:load data local inpath '路径' overwrite into table 表名 partition(分区字段 = 值);
  2. 导出数据
    • 可以通过查询语句选取所需要的的数据格式,再用insert字句将数据导出至HDFS或本地,如下:
    • insert overwrite  directory '路径' select * from 表名;
    • hadoop dfs -cp '路径' '目标路径';
posted @ 2020-11-28 23:04  大可耐啊  阅读(542)  评论(0编辑  收藏  举报