上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

【HIVE】数据的定义与操作

guduadmin116小时前

文章目录

  • 前言
  • 一、Hive基本数据类型
  • 二、Hive集合数据类型
  • 三、Hive数据定义与操作
    • 1.创建数据库
    • 2.查看数据库
    • 3.删除数据库
    • 4.创建表
    • 5.修改表
    • 6.删除表
    • 7.分区表
    • 四、数据的导入导出
      • 1.数据导入
      • 2.数据导出

        前言

        Hive作为数据仓库,用来存放企业的海量数据,Hive提供了丰富的数据类型,如关系型数据库,且提供了关系型数据库不支持的数据类型。


        一、Hive基本数据类型

        数据类型长度例子
        TINYINT1byte有符号整数30
        SMALLINT2byte 有符号整数30
        INT4byte 有符号整数30
        BIGIN8byte有符号整数30
        BOOLEAN布尔类型true 或者 falsetrue
        FLOAT单精度浮点数3.14159
        DOUBLE双精度浮点数3.14159
        STRING字符序列,可以指定字符集可以使用单引号或双引号“have a good day”
        TIMESTAMP整数、浮点数或者字符串1550738998125(Unix 新纪元秒)
        BINARY字节数组属于集合类型

        二、Hive集合数据类型

        数据类型描述字面语法事例
        STRUCT与C语言中的结构体struct类型相似,都可以通过"点"符号访问元素内容。例如,某表中某个列的数据类型为STRUCT(firNameSTRING, lastName STRING),那么第一个元素可通过字段名.firName 来引用STRUCT(“zhao”, “si”)
        MAPMAP是一个键值对映射集合。例如,表中某个列的数据类型是MAP,存放数据的格式是键→值,通过键就可以获取值,“Salary” → “8000”MAP(“Salary”, “10000”, “food”, “100”)
        ARRAYARRAY数组是一组具有相同类型变量的集合,这些变量被称为数组的元素,每个元素都有一个下标编号,编号从0开始,例如数组[“Salary”,“Late”]ARRAY(“Salary”, “food”)

        三、Hive数据定义与操作

        1.创建数据库

        create database stutest;
        

        为避免报错,可以使用以下语句:

        create database if not exists stutest;
        

        创建同时增加描述:

        create database stutest comment 'for test';
        

        2.查看数据库

        show databases;
        

        匹配数据库名

        show databases like 's.*';
        

        查看数据库描述(输出描述信息包括Hive为数据库stutest在HDFS分布式文件系统上创建的目录):

        describe database stutest;
        

        3.删除数据库

        drop database;
        

        为避免报错,可以使用以下语句:

        drop database if exists stutest;
        

        如果数据库里包含一张或多张表,需要把表全删除,才能删除数据库。也可以直接在命令后加上关键字cascade,将自行先删除表,再删除数据库。

        drop database if exists sogou cascade;
        

        4.创建表

        create table school.student(id bigint,name string,score double,age int) row format delimited fields terminated by ',';
        

        row delimited fields定义行格式化分隔, terminated by ','表示每一列之间的分隔符为都好(也可以定义其他如‘\t’)。

        同时也可以加入更多后缀如下;

        create table school.student(id bigint,name string,score double,age int) row format delimited fields terminated by ',' location '/user/hive/warehouse/stutest.db/school';
        

        其中/user/hive/warehouse/是默认数据仓库路径地址,stutest.db是数据库目录,school是表目录,/user/hive/warehouse/stutest.db就是在HDFS文件系统上的数据库目录。

        (1)管理表

        导入数据代码如下:

        load data local inpath '/home/oliver/data/student.txt' into table student;
        

        查看数据库中的数据表内容:

        show tables in stustudent;
        

        也可以直接使用Hadoop命令查看数据表信息:

        hadoop fs -ls hdfs://localhost:9000/user/hive/warehouse/stutest.db
        

        【HIVE】数据的定义与操作,在这里插入图片描述,第1张路径的最后就是表名,删除表后,路径也会被删除。

        2.外部表

        在创建表时,如果加上关键字external,则创建为外部表。外部表中的数据生命周期不受Hive的控制,且可以和其他外部表进行数据的共享。Hive 创建外部表的语法如下所示,我们创建一张产品表。

         create external table uuser (user_name string, user_id bigint) row format delimited fields terminated by '\t' location '/data/test'; 
         //ex-ternal关键字定义创建的表为外部表,location '/data/test'定义外部表test存放数据的HDFS 路径地址。
        

        Hive数据库中uuser表被删除之后,表uuser在HDFS上存放数据的目录上的/data/test/uuser.txt文件不会被删除,在实际开发过程中,外部表external是主要的应用类型。

        5.修改表

        重命名表:

        alter table stutest rename to stu;
        

        增加表字段:

        alter table stu add columns (sex string,height float);
        

        6.删除表

        drop table stu;
        

        删除表的过程中,只是删除表的元信息,对于外部表只会删除表元信息,表目录信息不会被删除。对于管理表则表元信息与表目录数据信息一同删除。

        7.分区表

        解决数据量过大产生的数据库性能问题,主要有创建分表和创建分区表两种方式。

        创建分表是将一张大表数据分配到多张小表中,提高数据并法量,但一张表结构发生变化,则其他表都会发生变化,需要较高的sql代码维护成本。

        创建分区表,是所有数据还在同一张数据表中,但底层物理存储数据根据一定的规则,划分到不同文件中(文件还可存储到不同的磁盘上)。使用表分区技术水平分散压力,将数据从物理上移动到距离使用最频繁的用户更近的地方,缺点是表的并法量没有提高。

        Hive的分区就是创建层级目录的一种方式。

        (1)静态分区

        创建静态分区表stu并且该表只有一个分区,分区列grade:

        create table stu(id int,name string) partitioned by (grade string) row format delimited fields terminated by ',';
        

        【HIVE】数据的定义与操作,在这里插入图片描述,第2张

        导入数据:

        1,赵
        2,钱
        3,孙
        
        load data local inpath '/home/oliver/data/stu_1.txt' into table stu partition(grade='first');
        

        导入效果

        【HIVE】数据的定义与操作,在这里插入图片描述,第3张

        查看表stu在HDFS上的目录结构:

        查看所在数据库的目录:

        【HIVE】数据的定义与操作,在这里插入图片描述,第4张根据所在数据库目录查看表在HDFS上的目录结构:

        hadoop fs -lsr /user/hive/warehouse/stutest.db;
        

        【HIVE】数据的定义与操作,在这里插入图片描述,第5张根据目录可知,在Hive数据仓库默认路径上会创建表明目录的同时,还创建一个分区名子目录,最后在分区名下存放那个世纪数据XX.txt。

        继续导入:

        【HIVE】数据的定义与操作,在这里插入图片描述,第6张可以看到,又新增了~/grade=second目录

        【HIVE】数据的定义与操作,在这里插入图片描述,第7张

        (2)动态分区

        动态分区区别与静态分区的表现为不用指定分区目录,由系统自己选择。

        开启动态分区:

        set hive.exec.dynamic.partition=true;
        

        将所有分区列设置为动态:

        set hive.exec.dynamic.partition.mode=nonstrict;  //默认是strict
        

        设置最大分区个数:

        set hive.exec.max.dynamic.partitions.pernode=1000; //最大分区个数
        

        检验:

        创建分区表

        create table student(id int) partitioned by (name string,grade string) row format delimited fields terminated by ',';
        

        将数据导入空表(insert overwrite)

        insert overwrite table student partition(name,grade) select id,name,grade from stu; 
        

        四、数据的导入导出

        1.数据导入

        除了使用HiveQL语句向表中传入数据外,可以通过HDFS命令行接口直接将xxx.txt数据导入Hive表,原理是将数据文件放到LOCATION属性所指向路径:

        hadoop fs -put xxx.txt /stutest/stu
        

        2.数据导出

        将数据从Hive仓库导出至本地,就是从HDFS导出数据(通过HDFS命令行接口),操作如下

        hadoop fs get /user/hive/warehouse/stutest.db/stu/xxx  //将表stu数据导出
        

网友评论

搜索
最新文章
热门文章
热门标签