zoukankan      html  css  js  c++  java
  • Hive的基本操作

    1.DDL数据定义

    1.1创建数据库

    CREATE DATABASE [IF NOT EXISTS] database_name
    [COMMENT database_comment]
    [LOCATION hdfs_path]
    [WITH DBPROPERTIES (property_name=property_value, ...)];
    注意结尾的时候要加分号
    
     1)创建一个数据库,数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db。
        create database if not exists student;  //在HDFS上的存储路径是/user/hive/warehouse/student.db
        if not exists 可以省略  ,加上是为了避免要创建的数据库已经存在
     2)创建一个数据库,指定数据库在HDFS上存放的位置
        create database if not exists student location '/stu';
      一般情况下,我们会创建数据库在默认的存储路径下
    

    1.2查询数据库

    1.2.1 显示数据库

         1)显示数据库   show databases;
         2)过滤显示查询数据库 show databases like 'stu*';
    

    1.2.2 查看数据库详情

         1)显示数据库信息  desc database student;
         2)显示数据库详细信息,extended  (可以查看出parameters的详细属性) desc database extended student;
    

    1.2.3 切换当前数据库

          use student;
    

    1.3修改数据库

     用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置
     alter database student set dbproperties('createtime'='20170830');
     查看修改后的数据库信息   desc database extended student;
    

    1.3删除数据库

     1)删除空数据库
        drop database student;
     2)如果删除的数据库不存在,最好采用 if exists判断数据库是否存在
        drop database if exists student;
     3)如果数据库不为空(数据库中有表格),可以采用cascade命令,强制删除
        drop database student cascade;
    

    1.4 创建表

    1)见表语法
    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
    [(col_name data_type [COMMENT col_comment], ...)] 
    [COMMENT table_comment] 
    [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
    [CLUSTERED BY (col_name, col_name, ...) 
    [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
    [ROW FORMAT row_format] 
    [STORED AS file_format] 
    [LOCATION hdfs_path]
    [TBLPROPERTIES (property_name=property_value, ...)]
    [AS select_statement]
    
    

    1.4.1 管理表(内部表)

        1)理论
          默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项                       
          hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。	当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
        2)案例实操  创建表
          1.普通创建表
            create table if not exists student(
            id int, name string
            )
            row format delimited fields terminated by '	'
            stored as textfile
            location '/user/hive/warehouse/student'; // 不写location的话存储在默认位置
          2.根据查询结果创建表(查询的结果会添加到新创建的表中)
            create table if not exists student3 as select id, name from student;
          3.根据已经存在的表结构创建表
            create table if not exists student4 like student;
          4.查询表的类型
            desc formatted student;
    

    1.4.2 外部表

        1)理论
           因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
        2)管理表和外部表的使用场景
           每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
        3)案例实操 (创建外部表)
           1.创建外部表
            create external table student(
            id int, 
            name string) 
            row format delimited fields terminated by '	' 
            location '/student';
           2. 上传数据到HDFS
               dfs -put /opt/module/datas/student.txt /student;
           3.查看创建的表
             select * from student;
           4.查看表格式化数据(可以查看是否为外部表  所属的数据库)
             desc formatted student;
           5.删除外部表
             delete table student;
             外部表删除后,hdfs中的数据还在,但是metadata中stu_external的元数据已被删除
             内部表删除后,hdfs中的数据也被删除,metadata中stu_external的元数据也被删除
    

    1.4.3 管理表与外部表的互相转换

        1.查询表的类型
          desc formatted student;
        2.修改内部表student为外部表
          alter table student set tblproperties('EXTERNAL'='TRUE');
        3.修改外部表student2为内部表
          alter table student set tblproperties('EXTERNAL'='FALSE');
         注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!要大写
    

    1.5 修改表

    1.5.1 重命名表

         alter table student rename to stu;
    

    1.5.2 增加/修改/替换列信息

           1.查询表结构   desc stu;
           2.添加列      alter table stu add columns(age int);  
             添加多列  中间加逗号分开即可alter table stu2 add columns(ages int, ass string);
           3.更新列    alter table stu2 change  ages age string;  注意 类型只能从小类型装变成的大类型
           4.替换所有列  alter table stu2 replace columns(ages int, ass string);  注意 类型只能从小类型装变成的大类型
    

    1.6 删除表

      drop table student;
    

    2.DML数据操作

    2.1 数据导入

    2.1.1 向表中装载数据(Load)

    1.语法
    hive> load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student [partition (partcol1=val1,…)];
    (1)load data:表示加载数据
    (2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
    (3)inpath:表示加载数据的路径
    (4)overwrite:表示覆盖表中已有数据,否则表示追加
    (5)into table:表示加载到哪张表
    (6)student:表示具体的表
    (7)partition:表示上传到指定分区
    
    
      2.实操
       1)创建一张表
         create table student (
          id int ,
          name string)
          row format delimited fields terminated by '	';
       2)加载本地文件到hive (这个类似于copy  本地还有此文件)
         load data local inpath '/opt/module/data/student.txt' into table stu2;
       3)加载HDFS文件到hive中(这个类似于mv  执行完成操作后,hdfs上没有此文件)
         3.1)上传文件到HDFS
             dfs -put /opt/module/datas/student.txt  /user/atguigu/hive;
         3.2)加载HDFS上数据
             load data inpath '/user/atguigu/hive/student.txt' into table student;
         3.3) 加载数据覆盖表中已有的数据 (原有数据被覆盖)
              1.hdfs上的数据 load data inpath '/user/atguigu/hive/student.txt' overwrite into table student;
              2.本地数据    load data local inpath '/opt/module/data/student.txt' overwrite into table student;
    

    2.1.2通过查询语句向表中插入数据(Insert)

        1.创建一张表
         create table student (
          id int ,
          name string);
         2.插入一条数据
          insert into student values(1,'zahngsan');
         3.插入一个表的数据(根据单张表查询结果)
           insert into student select * from stu2;
           insert into student select * from stu2 where id >1010;
           insert overwrite table student select * from stu2 where id >1010;  必须加table
    

    2.1.3查询语句中创建表并加载数据(As Select)

         create table if not exists student3  as select id, name from student;
         create table stu4 row format delimited fields terminated by '	' as select * from stu6;  //可以指定格式
    

    2.1.4创建表时通过Location指定加载数据路径

         1)上传数据到hdfs上
             dfs -mkdir /student;
             dfs -put /opt/module/datas/student.txt /student;
         2)创建表,并指定在hdfs上的位置
              create external table if not exists student5(
              id int, name string
              )
              row format delimited fields terminated by '	'
              location '/student;
          就是直接在有表数据的地方创建一个外部表。
    

    2.1.5Import数据到指定Hive表中

         注意:先用export导出后,再将数据导入。
        import table student2  from '/user/hive/warehouse/export/student';
    

    2.2数据导出

    2.2.1Insert导出

         1)将查询的结果导出到本地
          insert overwrite local directory '/opt/module/datas/export/student' select * from student;  
         2)将查询的结果格式化导出到本地
          insert overwrite local directory '/opt/module/datas/export/student1' ROW FORMAT DELIMITED FIELDS TERMINATED BY '	' select * from student;
         3)将查询的结果导出到HDFS上(没有local)
          insert overwrite directory '/opt/module/datas/export/student' ROW FORMAT DELIMITED FIELDS TERMINATED BY '	' select * from student;  
    

    2.2.2Hadoop命令导出到本地

          dfs -get /user/hive/warehouse/student/000000_0 /opt/module/datas/export/student3.txt;
    

    2.2.3 Hive Shell 命令导出(退出hive命令行)

         hive -e 'select * from default.student;' > /opt/module/datas/export/student4.txt;
    

    2.2.4 Export导出到HDFS上

         export table default.student to '/user/hive/warehouse/export/student';
         导出的数据带有数据和表结构 matadata 想要使用的时候可以直接导出
    

    2.3清除表中数据(Truncate)

     注意:Truncate只能删除管理表,不能删除外部表中数据
     truncate table student;
  • 相关阅读:
    方法的重载
    this用法
    简单的随机数 代码和笔记
    java内存简单剖析
    day 28
    day 27
    day 26
    day 25
    day 24
    day 23
  • 原文地址:https://www.cnblogs.com/xiao-bu/p/14305330.html
Copyright © 2011-2022 走看看