01:Hive从0到1系列学习:Hive的数据结构

46 篇文章 2 订阅

数据类型

Hive的数据类型可以分为两种,一种是基本数据类型,另一种是集合数据类型

1、基本数据类型
Hive数据类型Java数据类型长度例子
TINYINTbyte1byte有符号整数20
SMALINTshort2byte有符号整数20
INTint4byte有符号整数20
BIGINTlong8byte有符号整数20
BOOLEANboolean布尔类型,true或者falseTRUE FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.14159
STRINGstring字符系列。可以指定字符集。 可以使用单引号或者双引号。‘now is the time’ “for all good men”
TIMESTAMP时间类型
BINARY字节数组
2、集合数据类型

几何数据类型分为三种:STRUCT 、MAP 、 ARRAY

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

Hive的Map类型和Java的Map类型相似,Array类型也和Java的Array类型相似,而STRUCT类似于Python中的字典类型,但是很灵活,为键值对形式,但是值又可以为多种类型,比如字符串、列表、map等类型,属于一种嵌套的数据类型

举例:

比如对于一种表的数据如下,属于JSON类型:

{
    "name": "tangseng",
    "friends": ["fozu" , "pusa"] ,       //列表Array, 
    "students": {                      //键值Map,
        "sunwukong": 19 ,
        "zhubajie": 18,
        "shaseng":20,
    }
    "address": {                      //结构Struct,
        "street": "datang" ,
        "city": "dongtu" 
    }
}

基于上述的数据,我们在hive中创建相应的表,并且导入数据

①首先需要创建该文件

vim /opt/module/hive/datas/personinfo
tangseng,fozu_pusa,sunwukong:19_zhubajie:18_shaseng:20,datang_dongtu
sunwukong,zhubajie_shasheng,chengxiang:16_xiaoyu:17,shuiliandong_huaguoshan

注意:用逗号“,”表示一个键值对,值中用下划线“_”将各个值分开,结构用回车分开

②在hive中创建表personinfo

create table personInfo (
    name string,
    friends array<string>,
    students map<string, int>,
    address struct<street:string, city:string>
)
row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';

在这里插入图片描述

语句说明:

语句说明
name stringname字段为String类型
friend arrayfriend字段为array
children map<string, int>children字段为map
address struct<street:string, city:string>address字段为struct
fields terminated by ‘,’各字段之间用逗号分割
collection items terminated by ‘_’各值之间用下划线分割
lines terminated by ‘\n’各行之间用回车分割

③导入数据到hive表

load data local inpath '/opt/module/hive/datas/personInfo.txt' into table personinfo;

在这里插入图片描述

④查看数据

对于map的查询,直接是 字段[key]

对于array的查询,使用 字段[index]

对于struct的查询,使用 字段.key

select 
    friends[1],
    students['suwukong'],
    address.city
from personinfo
where name="tangseng";

在这里插入图片描述

3、类型转换

① Hive的基本数据类型是可以进行隐式转换的,类似于Java的类型转换

例如:某表达式使用INT类型,TINYINT会自动转换为INT类型

但是Hive不会进行逆向转换,比如INT类型不会自动转换为TINYINT类型,如果想要这种你想转换,需要使用CAST进行强转操作

CAST的使用

CAST('1' AS INT)

将字符’1’转换为整型INT,如果转换失败,则返回NULL

②隐式转换的规则

何整数类型都可以隐式地转换为一个范围更广的类型,如INT可以转换成BIGINT。

所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。

TINYINT、SMALLINT、INT都可以转换为FLOAT。

BOOLEAN类型不可以转换为任何其它的类型。

③自动转换和强转的区别

当自动转换时,如果两个类型可以转换为同一个类型,比如TINYINT和INT都可以隐式转换为FLOAT,则返回结果为FLOAT,如果强转,则就会返回想要的转换结果

select '1'+2, CAST('1' as INT)+2;

在这里插入图片描述

如果转换不了,就会返回NULL
在这里插入图片描述

如果是自动转换,就会报错
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧码文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值