Hive的数据类型及文件格式

1. 基本数据类型

Hive数据类型对应Java数据类型长度 例子
TINYINTbyte1byte有符号整数(-128 ~ 127)5
SMALINTshort 2byte有符号整数(-32,768 ~ 32,767)5
INTint4byte有符号整数(-2,147,483,648 ~ 2,147,483,647)55
BIGINTlong8byte有符号整数(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)5
BOOLEANboolean布尔类型,true或者falseTRUE/FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.141592653
STRINGstring字符串类型,可以使用单引号或者双引号'hello world'或"hello world"
TIMESTAMP时间类型unix1628664897605
BINARY字节数组
DECIMAL从Hive0.11.0开始支持DECIMAL(9, 7)

备注:对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

2. 复杂数据类型

数据类型语法示例描述
MAPMAP<STRING,FLOAT>MAP包含key->value键值对,可以通过key来访问元素。比如”userlist”是一个map类型,其中username是key,password是value;那么我们可以通过userlist['username']来得到这个用户对应的password;
ARRAYARRAY<STRING>ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的;
STRUCT

STRUCT<CITY:STRING,

AREA:STRING,

STREET:STRING,

NUMBER:INT>

STRUCT可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如user是一个STRUCT类型,那么可以通过user.address得到这个用户的地址。
UNIONUNIONTYPE,他是从Hive 0.7.0开始支持的。

建表:

create table if not exists
student(
  id INT,
  name STRING,
  cource ARRAY<STRING>,
  body MAP<STRING,FLOAT>,
  address STRUCT<CITY:STRING,AREA:STRING,STREET:STRING,NUMBER:INT>
) 
row format delimited fields terminated by ',' 
COLLECTION ITEMS TERMINATED BY '_' 
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

load data local inpath '/home/pro/student.text' into table student;
 
select * from student;
  • 建表时使用 STORED AS 子句指定文件存储的格式,该子句表示了该表是以何种文件形式存储在文件系统。
  • 数据格式:数据存储在文本文件中,需要按照一定的格式区分行和列并且向Hive指明,Hive才能将其识别,常见的格式有CSV(逗号分隔)和TSV(制表符分隔)。
  • row format delimited fields terminated by ','  -- 列分隔符

    collection items terminated by '_'      --MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)

    map keys terminated by ':'                -- MAP中的key与value的分隔符

    lines terminated by '\n';                    -- 行分隔符
    (可以看到,我们定义了三种不同的集合类型字段,并指定了集合类型的分隔符为"_",即struct,array,以及map的不同kv之间用"_"分割,同时定义了map的key和value之间用":"分割。)

1,文文,语文_数学_英语_音乐,Height:165_weight:50,深圳_福田区_益田路_5023
2,毛毛,语文_数学_英语_体育,Height:175_weight:60,深圳_南山区_深南大道_9037
3,超超,语文_数学_英语_美术,Height:170_weight:60,深圳_罗湖区_深南东路_5002

select * from student;

3. 数据类型转换

Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作。

隐式类型转换规则:

下表列出了Hive内置的数据类型之间是否可以进行隐式的转换操作:

bltinyintsiintbigintfloatdoubledmstringvctsdateba
booleantruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
tinyintfalsetruetruetruetruetruetruetruetruetruefalsefalsefalse
smallintfalsefalsetruetruetruetruetruetruetruetruefalsefalsefalse
intfalsefalsefalsetruetruetruetruetruetruetruefalsefalsefalse
bigintfalsefalsefalsefalsetruetruetruetruetruetruefalsefalsefalse
floatfalsefalsefalsefalsefalsetruetruetruetruetruefalsefalsefalse
doublefalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
decimalfalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalsefalse
stringfalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
varcharfalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
tsfalsefalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalse
datefalsefalsefalsefalsefalsefalsefalsefalsetruetruefalsetruefalse
binaryfalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetrue

注:由于表格比较大,这里对一些比较长的字符串进行缩写,ts是timestamp的缩写,bl是boolean的缩写,sl是smallint的缩写,dm是decimal的缩写,vc是varchar的缩写,ba是binary的缩写。

  • 任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
  • 所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
  • TINYINT、SMALLINT、INT都可以转换为FLOAT。
  • BOOLEAN类型不可以转换为任何其它的类型。

使用CAST操作显示进行数据类型转换:

  • 例如CAST('1' AS INT)将把字符串'1' 转换成整数1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL。
  • 对于BINARY类型的数据,只能将BINARY类型的数据转换成STRING类型。如果你确信BINARY类型数据是一个数字类型(a number),这时候你可以利用嵌套的cast操作,比如a是一个BINARY,且它是一个数字类型,那么你可以用下面的查询:
    SELECT (cast(cast(a as string) as double)) from src;
  • 对于Date类型的数据,只能在Date、Timestamp以及String之间进行转换。下表将进行详细的说明:
    有效的转换	                结果
    cast(date as date)	        返回date类型
    cast(timestamp as date)	    timestamp中的年/月/日的值是依赖与当地的时区,结果返回date类型
    cast(string as date)	    如果string是YYYY-MM-DD格式的,则相应的年/月/日的date类型的数据将会返回;但如果string不是YYYY-MM-DD格式的,结果则会返回NULL。
    cast(date as timestamp)	    基于当地的时区,生成一个对应date的年/月/日的时间戳值
    cast(date as string)	    date所代表的年/月/日时间将会转换成YYYY-MM-DD的字符串。

4. 文件格式

  • TEXTFILE //文本,默认值
  • SEQUENCEFILE // 二进制序列文件
  • RCFILE //列式存储格式文件 Hive0.6以后开始支持
  • ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持
  • PARQUET //列式存储格式文件,Hive0.13以后开始支持

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大数据翻身

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

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

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

打赏作者

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

抵扣说明:

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

余额充值