zoukankan      html  css  js  c++  java
  • 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 '路径' '目标路径';
  • 相关阅读:
    MySQL的char和varchar针对空格的处理
    单KEY业务,数据库水平切分架构实践
    接口测试学习笔记1-接口测试的用例设计
    Robot Framework源码解析(2)
    Robot Framework 源码解析(1)
    Python学习笔记1 -- TypeError: 'str' object is not callable
    OKHttp源码学习同步请求和异步请求(二)
    OKHttp源码学习--HttpURLConnection HttpClient OKHttp Get and post Demo用法对比
    Javapoet源码解析
    Universal-Image-Loader源码解解析---display过程 + 获取bitmap过程
  • 原文地址:https://www.cnblogs.com/wyk1/p/14054098.html
Copyright © 2011-2022 走看看