Hive数据类型[通俗易懂]

Hive数据类型[通俗易懂]1.Hive数据类型Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下面是Hive数据类型的一个总结:分类类型描述字面量示例原始类型BOOLEANtrue/falseTRUETINYINT1字节的有符号整数-128~1271YSMALL

大家好,又见面了,我是你们的朋友全栈君。

1. Hive数据类型

Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下面是Hive数据类型的一个总结:

分类 类型 描述 字面量示例
原始类型 BOOLEAN true/false TRUE
TINYINT 1字节的有符号整数 -128~127 1Y
SMALLINT 2个字节的有符号整数,-32768~32767 1S
INT 4个字节的带符号整数 1
BIGINT 8字节带符号整数 1L
FLOAT 4字节单精度浮点数1.0
DOUBLE 8字节双精度浮点数 1.0
DEICIMAL 任意精度的带符号小数 1.0
STRING 字符串,变长 “a”,’b’
VARCHAR 变长字符串 “a”,’b’
CHAR 固定长度字符串 “a”,’b’
BINARY 字节数组 无法表示
TIMESTAMP 时间戳,纳秒精度 122327493795
DATE 日期 ‘2016-03-29’
复杂类型 ARRAY 有序的的同类型的集合 array(1,2)
MAP key-value,key必须为原始类型,value可以任意类型 map(‘a’,1,’b’,2)
STRUCT 字段集合,类型可以不同 struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)
UNION 在有限取值范围内的一个值 create_union(1,’a’,63)

2. 基本类型

HQL的基本类型和Java的基本类型很接近,虽然受到一些MySQL命名的影响。

2.1 整数类型

Hive有4种带符号的整数类型:TINYINT,SMALLINT,INT,BIGINT,分别对应Java中的byte,short,int,long。字节长度分别为1,2,4,8字节。在使用整数字面量时,默认情况下为INT,如果要声明为其他类型,通过后缀来标识:

类型 后缀 例子
TINYINT Y 100Y
SMALLINT S 100S
BIGINT L 100L

2.2 小数

浮点类型包括FLOAT和DOUBLE两种,对应到Java的float和double,分别为32位和64位浮点数。DECIMAL用于表示任意精度的小树,类似于Java的BigDecimal,通常在货币当中使用。例如DECIMAL(5,2)用于存储-999.99到999.99的数字,省略掉小数位,DECIAML(5)表示-99999到99999的数字。DECIMAL则等同于DECIMAL(10,0)。小数点左边允许的最大位数为38位。

数值类型总结如下表:

Numeric-Data-types.jpg-77.3kB

2.3 文本类型

Hive有3种类型用于存储字文本。STRING存储变长的文本,对长度没有限制。理论上将STRING可以存储的大小为2GB,但是存储特别大的对象时效率可能受到影响,可以考虑使用Sqoop提供的大对象支持。VARCHAR与STRING类似,但是长度上只允许在1-65355之间。例如VARCHAR(100).CHAR则用固定长度来存储数据。

String-data-types.jpg-66.6kB

2.4 布尔及二进制

BOOLEAN表示二元的true或false。
BINARY用于存储变长的二进制数据。

2.5 时间类型

TIMESTAMP则存储纳秒级别的时间戳,同时Hive提供了一些内置函数用于在TIMESTAMP与Unix时间戳(秒)和字符串之间做转换。例如:

cast(date as date)
cast(timestamp as date)
cast(string as date)
cast(date as string)

时间戳类型的数据不包含任务的时区信息,但是to_utc_timestampfrom_utc_timestamp函数可以用于时区转换。DATE类型则表示日期,对应年月日三个部分。

3. 类型转换

Hive的类型层次中,可以根据需要进行隐式的类型转换,例如TINYINT与INT相加,则会将TINYINT转化成INT然后INT做加法。隐式转换的规则大致可以归纳如下:

  • 任意数值类型都可以转换成更宽的数据类型(不会导致精度丢失)或者文本类型。

  • 所有的文本类型都可以隐式地转换成另一种文本类型。也可以被转换成DOUBLE或者DECIMAL,转换失败时抛出异常。

  • BOOLEAN不能做任何的类型转换。

  • 时间戳和日期可以隐式地转换成文本类型。

也可以使用CAST进行显式的类型转换,例如CAST('1' as INT),如果转换失败,CAST返回NULL。

4. 复杂类型

Hive有4种复杂类型的数据结构:ARRAY,MAP,STRUCT,UNION。

4.1 ARRAY和MAP

ARRAY和MAP类型与Java中的数据和映射表。数组的类型声明格式为ARRAY<data_type>,元素访问通过0开始的下标,例如arrays[1]访问第二个元素。
MAP通过MAP<primitive_type,data_type>来声明,key只能是基本类型,值可以是任意类型。map的元素访问则使用[],例如map['key1'].

4.2 STRUCT

STRUCT则封装一组有名字的字段(named filed),其类型可以是任意的基本类型,元素的访问使用点号。

4.3 UNION

UNION则类似于C语言中的UNION结构,在给定的任何一个时间点,UNION类型可以保存指定数据类型中的任意一种。类型声明语法为UNIONTYPE<data_type,data_type,…>。每个UNION类型的值都通过一个整数来表示其类型,这个整数位声明时的索引,从0开始。例如:

CREATE TABLE union_test(foo UNIONTYPE<int,double,array<string>,strucy<a:int,b:string>>);

foo的一些取值如下:

{
  
  0:1}
{
  
  1:2.0}
{
  
  2:["three" , "four"]}
{
  
  3:["a":5,b:"five"]}
{
  
  0:9}

其中冒号左边的整数代表数据类型,必须在预先定义的范围类,通过0开始的下标表示。冒号右边是该类型的取值。

下面的这个CRATE语句用到了这4中复杂类型:

CREATE TABLE complex ( c1 ARRAY<INT>, c2 MAP<STRING,INT>, c3 STRUCT<a:STRING,b:INT,c:DOUBLE>, c4 UNIONTYPE<STRING,INT> );

通过下面的SELECT语句查询相应的数据:

SELECT c1[0] , c2['b'],c3.c , c4 FROM complex

结果类似:

1 2 1.0 { 
   1:63}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125328.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 别再浪费顶头上司的时间了::哈佛商业评论::每日管理小贴士

    别再浪费顶头上司的时间了::哈佛商业评论::每日管理小贴士

    2021年8月19日
    60
  • python多因素方差分析_双因素方差分析例题

    python多因素方差分析_双因素方差分析例题在实际应用中,一个实验的指标往往受到多个因素的影响。例如饮料的销量有可能受到销售地区或者饮料颜色的影响。在方差分析中,若把饮料的颜色看做影响销量的因素A,把销售地区看做影响因素B。同时对因素A和因素B进行分析,就称为双因素方差分析。a b ca1 b1 20a1 b2 22a1 b3 24a1 b4 16a1 b5 26a2 b1 12a2 b2 10a2 b3 14a2 b…

    2022年10月7日
    4
  • net.sf.json.JSONException: null object_json数组转json对象

    net.sf.json.JSONException: null object_json数组转json对象1简介在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。JSON建构于两种结构:“名称/值”对的集合(ACollectionofna…

    2022年9月22日
    2
  • es6数组 newSet 数组去重 并集 交集 差集

    es6数组 newSet 数组去重 并集 交集 差集数组去重vararr=[1,2,3,3,1,4];[…newSet(arr)];//[1,2,3,4]Array.from(newSet(arr));//[1,2,3,4][…newSet(‘ababbc’)].join(’’);//“abc”字符串去重newSet(‘icedoughnut’);//Set(11){“i”,“c”,“e”,””,“d”,…}并集vara=newSet([1,2,3]);varb=ne

    2025年7月27日
    3
  • ODS概念总结_ODS系统

    ODS概念总结_ODS系统概念DB(Database)数据库ODS(OperationalDataStore)运营数据存储DW(DataWarehouse)数据仓储DM(DataMarket)数据集市ODS产生背景人们对数据的处理行为可以划分为事务型数据处理(OLTP,On-LineTransactionProcessing)和分析型数据处理(OLAP,On-LineAnalyticProces…

    2022年9月26日
    3
  • lombok插件失效原因_lombok插件下载

    lombok插件失效原因_lombok插件下载昨晚项目出了个小问题,lombok插件失效了。由于使用了lombok的@Data注解生成实体类的getter和setter,项目运行时所有的使用getter和setter方法的地方全都报错。看了网上的解决方案,一个一个试,发现没有一个能解决我的问题最后,我发现在pom.xml文件里面的<build></build>里面缺少了lombok的部分,把他加上即可<build><plugins><plugin

    2025年8月30日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号