• Hive之数据类型和视图



    Hive系列


    第八章 数据类型和视图

    8.1 数据类型

    8.1.1 原子数据类型

    在这里插入图片描述
    (其实上图中有一点错误,大家可以找找看)

    说明:

    1、Hive 支持日期类型(老版本不支持),在 Hive 里日期一般都是用字符串来表示的,而常用的日期格式转化操作则是通过自定义函数进行操作,当然也可以直接指定为日期类型。
    
    2、Hive 是用 Java 开发的,Hive 里的基本数据类型和 java 的基本数据类型基本上是对应的, 除了 String 类型。
    
    3、有符号的整数类型:TINYINT、SMALLINT、INT 和 BIGINT 分别等价于 Java 的 Byte、Short、 Int 和 Long 原子类型,它们分别为 1 字节、2 字节、4 字节和 8 字节有符号整数。
    
    4、Hive 的浮点数据类型 FLOAT 和 DOUBLE,对应于 Java 的基本类型 Float 和 Double 类型。
    
    5、Hive 的 BOOLEAN 类型相当于 Java 的基本数据类型 Boolean。 
    
    6、Hive 的 String 类型相当于数据库的 Varchar 类型,该类型是一个可变的字符串,不过它不 能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    8.1.2 复杂数据类型

    8.1.2.1 理论

    复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下所示

    ARRAY:ARRAY 类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。 比如有一个 ARRAY 类型的变量 fruits,它是由['apple','orange','mango']组成,那么我们可以通过 fruits[1]来访问元素 orange,因为 ARRAY 类型的下标是从 0 开始的 。
    
    MAP:MAP 包含 key->value 键值对,可以通过 key 来访问元素。比如”userlist”是一个 map 类 型 , 其 中 username 是 key , password 是 value ; 那 么 我 们 可 以 通 过 userlist['username']来得到这个用户对应的 password。
    
    STRUCT:STRUCT 可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如 user 是一个 STRUCT 类型,那么可以通过 user.address 得 到这个用户的地址。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例:

    CREATE TABLE student(  
    	name STRING,  
    	favors ARRAY,  
    	scores MAP,     
    	address STRUCT 
    )     
    	ROW FORMAT DELIMITED     
    	FIELDS TERMINATED BY '\t'     
    	COLLECTION ITEMS TERMINATED BY ';' 
    	MAP KEYS TERMINATED BY ':' ; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    说明:

    1、字段 name 是基本类型,favors 是数组类型,可以保存很多爱好,scores 是映射类型,可以保存多个课程的成绩,address 是结构类型,可以存储住址信息 。
    2、ROW FORMAT DELIMITED 是指明后面的关键词是列和元素分隔符的 。
    3、FIELDS TERMINATED BY 是字段分隔符 。
    4、COLLECTION ITEMS TERMINATED BY 是元素分隔符(Array 中的各元素、Struct 中的各元素、 Map 中的 key-value 对之间) 。
    5、MAP KEYS TERMINATED BY 是 Map 中 key 与 value 的分隔符 。
    6、LINES TERMINATED BY 是行之间的分隔符 。
    7、STORED AS TEXTFILE 指数据文件上传之后保存的格式 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总结:在关系型数据库中,我们至少需要三张表来定义,包括学生基本表、爱好表、成绩表; 但在 Hive 中通过一张表就可以搞定了。也就是说,复合数据类型把多表关系通过一张表就 可以实现了。

    8.1.2.2 实践
    1、数组
    create database db;
    use db;
    create table person(name string,location array) row format delimited fields terminated by "\t" collection items terminated by ",";
    
    vim array.txt,在里面添加如下数据
    Huangbo	beijing,shanghai,tianjin,Hangzhou
    Xuzheng	tianjin,chengdu,wuhan 
    Wangbaoqiang	wuhan,shenyang,jilin
    
    load data local inpath '/home/data/array.txt' into table person;
    
    select * from person;
    select location from person;
    select location[0] from person;
    
    2、map
    vim map.txt
    huangbo	yuwen:80,shuxue:89,yingyu:95
    xuzheng	yuwen:70,shuxue:65,yingyu:81
    wangbaoqiang	yuwen:75,shuxue:100,yingyu:75
    
    接下来创建一个新的表,可以解析这个三个数据:
    create table score(name string, scores map) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':';
    
    desc formatted score;
    
    load data local inpath '/home/data/map.txt' into table score;
    
    select * from score;
    select name from score; 
    select scores from score; 
    select s.scores['yuwen'] from score s;
    
    3、struct结构
    建表语句: 
    create table structtable(id int,course struct) row format delimited fields terminated by '\t' collection items terminated by ','; 
     数据: 
    vim structtable.txt
    1	english,80
    2	math,89
    3	chinese,95
     
    导入数据: 
    load data local inpath '/home/data/structtable.txt' into table structtable; 
     
    查询语句: 
    select * from structtable;
    select id from structtable;
    select course from structtable;
    select t.course.name from structtable t;
    select t.course.score from structtable t;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    8.2 Hive视图

    8.2.1 理论

    和关系型数据库一样,Hive 也提供了视图的功能,不过请注意,Hive 的视图和关系型数据库的视图还是有很大的区别:
    1、只有逻辑视图,没有物理视图;
    2、视图只能查询,不能 Load/Insert/Update/Delete 数据;
    3、视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询 。

    创建视图

    create view view_name as select * from carss; 
    create view carss_view as select * from carss limit 500; 
    
    • 1
    • 2

    查看视图

    show tables;   // 可以查看表,也可以查看视图 
    desc view_name  // 查看某个具体视图的信息 
    desc carss_view 
    
    • 1
    • 2
    • 3

    删除视图

    drop view view_name 
    drop view if exists carss_view 
    
    • 1
    • 2

    使用视图

    create view sogou_view as select * from sogou_table where rank > 3 ; 
    select count(distinct uid) from sogou_view; 
    
    
    • 1
    • 2
    • 3

    8.2.2 实际操作

    视图
    use myhive;
    查询下面的语句
    select department, count(*) as total from student group by department;
    
    select a.department,a.total from (select department, count(*) as total from student group by department) a;
    
    创建一个视图:
    create view groupby_dpt_count as select department, count(*) as total from student group by department;
    
    select a.department,a.total from groupby_dpt_count a;//虚表
    select department,total from groupby_dpt_count;//虚表
    
    show views;1.x不对,2.x对,3.x对。
    show tables;//对的
    
    删除视图:
    drop table groupby_dpt_count;//这是不可以的。不同版本不一样。注意测试。
    2021-10-11 22:19:59,670 ERROR [5f4ee6d3-64c4-4b25-afe9-b17761db9179 main] exec.DDLTask: Failed
    org.apache.hadoop.hive.ql.metadata.HiveException: Cannot drop a view with DROP TABLE
    .......
    注意测试,不同的版本不一样。hive3.1.2报错如上
    
    drop view groupby_dpt_count;//可以的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24


    声明:
            文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


    By luoyepiaoxue2014

    微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

  • 相关阅读:
    阿里云2核2G服务器e实例40G ESSD Entry系统盘99元一年
    第十九章 使用工作队列管理器(二)
    【ES实战】ES创建Transports客户端时间过长分析
    Node.js环境配置级安装vue-cli脚手架
    前端Vue自定义得分构成水平柱形图组件 可用于系统专业门类得分评估分析
    CodeSite for .NET实时本地和远程应用程序日志记录
    C# 分割与截取字符串、填充字符使得字符串长度对齐
    GE IS420UCSCH2A-C-V0.1-A模拟量输入模块
    QSqlQuery查询语句
    webpack的loader和插件plugin
  • 原文地址:https://blog.csdn.net/luoyepiaoxue2014/article/details/128048291