打怪升级之小白的大数据之旅(六十二)<Hive旅程第三站:Hive数据类型>

打怪升级之小白的大数据之旅(六十二)

Hive旅程第三站:Hive数据类型

上次回顾

上一章,我们对Hive的安装进行了学习,本章正式学习Hive的相关操作,按照惯例,学习一个新的语言就要了解它的数据类型

数据类型

  • Hive的数据类型分为两大类,基本数据类型和集合数据类型,集合数据类型可以嵌套,所以它更加灵活多变
  • Hive的数据类型和我们学习的Java的数据类型基本相似,所以我们只需要记住一些特别的就可以轻松掌握它了

注释与语法规范

hive的注释有两种方式

  • 单行注释 --
  • 多行注释 /**/

HQL的语法规范(和Mysql中学习的一样)
(1)SQL 语言大小写不敏感。
(2)SQL 可以写在一行或者多行
(3)关键字不能被缩写也不能分行
(4)各子句一般要分行写。
(5)使用缩进提高语句的可读性。

基本数据类型

HIVEMySQLJAVA长度例子
TINYINTTINYINTbyte1byte有符号整数2
SMALINTSMALINTshort2byte有符号整数20
INTINTint4byte有符号整数20
BIGINTBIGINTlong8byte有符号整数20
BOOLEANboolean布尔类型,true或者falseTRUE FALSE
FLOATFLOATfloat单精度浮点数3.14159
DOUBLEDOUBLEdouble双精度浮点数3.14159
STRINGVARCHARstring字符系列。可以指定字符集。可以使用单引号或者双引号‘now is the time’ “for all good men”
TIMESTAMPTIMESTAMP时间类型
BINARYBINARY字节数组

对于Hive的基本数据类型,我们需要与java进行区分以下几个特别的类型

  • INT
  • BIGINT
  • DOUBLE
  • STRING

基本数据类型比较简单,我就不举栗子了,它跟我们mysql中的使用方式一样

集合数据类型

数据类型描述特点语法示例
STRUCTstruct类型类似集合类型,但它使用. 来访问元素内容个数可以不相同,但是类型相同struct<street:string, city:string>
MAPMAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素key-value可以不相同,个数也可以不同map<string, int>
ARRAY数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用个数相同,类型相同array<string>

下面通过示例来演示我们的集合数据类型

  • 假设某表有如下一行,我们用JSON格式来表示其数据结构。数据的样子如下

    {
        "name": "songsong",
        "friends": ["bingbing" , "lili"],       //列表Array, 
        "children": {                              //键值Map,
            "xiao song": 18,
            "xiaoxiao song": 19
        }
        "address": {                              //结构Struct,
            "street": "hui long guan",
            "city": "beijing",
            "email": "10010"
        }
    }
    
  • 下面我们根据上面的样子导入测试数据

    # 创建本地测试文件,我放到了hive根目录下,并专门创建了一个存储数据的文件夹
    # vim $HIVE_HOME/dbdata/test1.txt 
    songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing_10010
    yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing_10011
    
  • 数据解读

    /*
    共创建了两条数据,使用换行`\n`进行区分,每条数据中,每个类型间的数据使用`,` 进行区分,使用_来区分当前类型间的两个数据
    数据类型如下:
    	name: string类型
    	friends: array类型
    	children: map类型
    	address: struct类型
    */
    
    # 第一条数据
    songsong,
    bingbing_lili,
    xiao song:18_xiaoxiao song:19,
    hui long guan_beijing_10010
    
    # 第二条数据
    yangyang,
    caicai_susu,
    xiao yang:18_xiaoxiao yang:19,
    chao yang_beijing_10011
    
    
     
    
  • 创建表,建表的参数我后面会详细讲解,大家先直接复制

    create table test(
    name string,
    friends array<string>,
    children map<string, int>,
    address struct<street:string,city:string,email:int>
    )
    row format delimited fields terminated by ','
    collection items terminated by '_'
    map keys terminated by ':'
    lines terminated by '\n';
    
  • 导入数据到test表中

    load data local inpath "/opt/module/hive/dbdata/test/test1.txt" into table test;
    
  • 访问数据

    -- 获取名字叫songsong的第二个朋友、songsong的孩子xiao song的年龄以及songsong的地址信息
    select 
    	name,
    	friends[1],
    	children['xiao song'],
    	address.city,
    	address.street 
    from test
    where name="songsong";
    

类型转换

  • 在Hive中,它的原子数据类型是可以进行隐式转换的(原子数据类型指的就是基本数据类型)

  • 隐式类型转换规则同样分为自动转换和强制转换:

  • 自动转换

    • 任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT
    • 所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE
    • TINYINT、SMALLINT、INT都可以转换为FLOAT
    • BOOLEAN类型不可以转换为任何其它的类型
  • 强制转换(采用关键字CAST)

    • 例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1;如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL
  • 下面通过类型转换示例来体验一下

    -- 自动转换
    select '1'+2
    -- 强制转换
    select cast("1" as int) + 2;
    -- 转换失败的示例,会返回NULL
    select cast("a" as int) + 2;
    

总结

本章节主要对HQL的数据类型进行了介绍,为了便于大家以后查看,所以我将每个单独的知识点拆分发布,下一章就是对数据库、数据表的操作DDL操作介绍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值