Hive数据类型和使用注意事项详解

Hive数据类型和使用注意事项详解了解 Hive 数据类型 是 Hive 编程的基础 使用 hive 建表 首先要明白 hive 常用的数据类型有哪些 可以存储哪些类型的数据 其实 Hive 支持关系型数据库中的大多数基本数据类型 且同时支持关系型数据库中少见的 3 种集合数类型 STRUCT MAP ARRAY 然而学习技术最好的方式之一就是去查看官方文档 Hive 关于数据类型官网地址 Hive 官网关于数据类型的介绍

      了解Hive数据类型 ,是Hive编程的基础。使用hive建表,首先要明白hive常用的数据类型有哪些,可以存储哪些类型的数据。其实Hive支持关系型数据库中的大多数基本数据类型,且同时支持关系型数据库中少见的3种集合数类型(STRUCT,MAP,ARRAY)。然而学习技术最好的方式之一就是去查看官方文档。

      Hive关于数据类型官网地址Hive官网关于数据类型的介绍

一.Hive数据类型与使用

     下面介绍的是基于hive v0.80版本之后的hive支持的数据类型,同关系型数据库一样,hive支持多种不同长度的整型和浮点型数据,同时支持布尔型,不定长度的字符串型(注意,这里的int,float,double等底层实现原理和java中底层实现一样,因为hive基于java开发的,底层是对java接口的实现,所以也会规定数据类型的内存占用空间。)

1. 数值型(标注红色为常用的)

   在Hive里默认情况下,整数型为INT型,当数字大于INT型的范围时,会自动解释执行为BIGINT,或者直接用后缀进行说明100Y,100S,100L(对应为tinyint,smallint,bigint)

类型 支持范围
TINYINT 1-byte signed integer, from -128 to 127 ,范围太小,基本不用
SMALLINT 2-byte signed integer, from -32,768 to 32,767   基本也不用。
INT/INTEGER 4-byte signed integer, from -2,147,483,648 to 2,147,483,647   ,INTERGER是hive2.20中才开始有的,一般不用
BIGINT 8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807  为int的补充使用
FLOAT 4-byte single precision floating point number,常用单精度浮点数3.14159
DOUBLE 8-byte double precision floating point number 双精度浮点,存储更大。3.
DECIMAL

1.hive.0.13.0才开始使用,Hive的小数型是基于Java BigDecimal做的, BigDecimal在java中用于表示任意精度的小数类型。所有常规数字运算(例如+, – ,*,/)和相关的UDFs(例如Floor,Ceil,Round等等)都使用和支持Decimal。

decimal数值类型使用演示:

1.decimal的使用decimal(precision, scale),前面是整数部分,后面是小数部分。 整数部分如果没有定义,则默认长度为10,小数部分如果没有指定,则默认为0. 如果超出长度则会截取,如下小数部位默认长度为0,被四舍五入截取了,整数部位进1。 hive (fdm_sor)> select CAST(. AS DECIMAL) from aaaa limit 1;  2.如果需要转换的数据长度超过decimal指定长度,则结果不会截取,直接为null值,尽管decimal最长可以存储长度为38位的小数。 如下默认整数部分长度为10,现在需要转化的数据整数长度超过10,直接整个结果为NULL hive(fdm_sor)> select CAST(. AS DECIMAL) from aaaa limit 1; NULL 3.使用decimal将其他类型的数据转换成decimal,指定长度,超出部分四舍五入。 hive (fdm_sor)> select CAST(. AS DECIMAL(20,5)) from aaaa limit 1; .12346 

2.字符型的数据类型(标注红色为常用的)

string与varchar,char的区别和联系

1.varchar固定长度,使用时要指定长度.所以转换的时候有可能超出指定长度后,数据丢失,这点不如string hive (fdm_sor)> select CAST("ABCDEFGHICD" AS VARCHAR(10)) from aaaa limit 1; ABCDEFGHIC 2.varchar建表时,需要指定长度,否则报错。长度如果指定小了,数据插入会直接被截取长度。如下所示: hive (fdm_sor)> create table tmp_varchar(id varchar(10)) > ; hive (fdm_sor)> insert overwrite table tmp_varchar > select "2" from aaaa; tmp_varchar.id     3.同理,char的使用也需要指定长度,只是char的长度比varchar小多了,这个两者的使用有点类似数据库 CREATE TABLE foo (bar CHAR(10)) 4.一般来说能用string类型的尽量使用string类型。 

3.日期型数据类型

类型 使用说明
TIMESTAMP 1.始于Hive 0.8.0。用来表示UTC时间(时间标准时间)。提供了用于时区转换的便捷UDFs(to_utc_timestamp,from_utc_timestamp)。2. 所有现有的日期时间UDFs(月,日,年,小时等)都使用TIMESTAMP数据类型。其次TIMESTAP支持整型,浮点型,字符串型的数据。具体使用后面介绍实际开发中使用的也不是特别多。
DATE 始于Hive 0.12.0   DATE值描述特定的年/月/日,格式为YYYY-MM-DD。 例如,DATE’2013-01-01’。 日期类型没有时间组件。 Date类型支持的值范围是0000-01-01到9999-12-31,这取决于Java Date类型的原始支持。 
Date types只能在Date, Timestamp, or String types之间转换。

INTERVAL 始于Hive 1.2.0,实际开发中不怎么用。
---1.使用timestamp创建日期类型的字段,可以存储浮点,整型,字符串类型的时间数据 create table fdm_sor.tmp_aaaaa( a int, b bigint, c timestamp ) --2.测试数据 hive (fdm_sor)> insert overwrite table fdm_sor.tmp_aaaaa --存放字符串型时间 > select 1,2,"2019-05-22 21:23:34" from fdm_sor.tmp_aaaaa limit 3; hive (fdm_sor)> select * from fdm_sor.tmp_aaaaa; OK 1 2 2019-05-22 21:23:34 1 2 2019-05-22 21:23:34 hive (fdm_sor)> insert overwrite table fdm_sor.tmp_aaaaa ---存放数值型数据 > select 3,4, from fdm_sor.tmp_aaaaa limit 2; hive (fdm_sor)> select * from fdm_sor.tmp_aaaaa; OK 3 4 1970-01-01 11:25:34.324 3 4 1970-01-01 11:25:34.324

4.其他数据类型

  • BOOLEAN类型:TRUE or FALSE
  • BINARY类型:字节数组,类似数据库的varbinary。

5复合数据类型,不常用 

arrays ARRAY(data_type)
maps MAP(primitive_type, data_type)
structs STRUCTcol_name : data_type [COMMENT col_comment], …)
union UNIONTYPE(data_type, data_type, …)

二.Hive不同数据类型之间的转换

1.同数据类型之间的转换

        hive底层是java实现开发的,hive的数据类型很多也跟java保持一致,所以对于同类型的数据类型进行转换时也遵循java的自动“向上转型”规则,即低类型的数据在和高类型的数据进行逻辑运算时,会隐式的自动转换成高类型的数据类型。然后再进行计算。比如1和1.23比较,会自动将1转换成1.0进行计算比较。

2.不同数据类型的转换

     hive中不同数据类型的数据再进行比较运算时,需要用cast函数进行手动转换。

     cast函数使用:cast(valule as type),value是需要被转换的数据, AS是固定关键字,type是需要转换的类型

>select cast("1223" as double), cast("456.23" as int), cast("1.99" as int), cast("abc" as int) from aaaa; >1223.0, 456, 1, NULL

   注意:如上结果显示,cast的转换功能也不是万能的,必须是“存储的类型值”符合转换条件才能进行转换。否则是NULL值的结果。比如“abc”转换成double,很明显abc不是数值,所以转换失败,结果时NULL值。此外,如果使用cast将高类型的数据转换成低类型的数据,cast函数会直接截取,损失数据精度甚至得到错误结果。

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

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

(0)
上一篇 2026年3月17日 下午11:00
下一篇 2026年3月17日 下午11:00


相关推荐

  • Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]

    Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]QT中在QWidget支持拖拽功能,QTreeWidget继承自QWidget,所以自然也具有节点的拖拽功能。拖拽包含两个功能:一个是拖动(Drag),一个是放下(Drop)。拖动的数据是QMimeData数据,MIME数据定义格式:类型/数据(注意中间有斜线)。若被拖动的对象放下的控件,不接受拖动的对象,Qt光标显示禁用的形状(一个禁用形状)。开始拖动:通过调用QDrag::exec()…

    2026年4月19日
    6
  • js数组添加元素的几种方式

    js数组添加元素的几种方式方法一 在数组开头添加元素在数组开头添加元素可以通过数组名 push 方法来实现 该方法可以接受任意数量的参数逐个添加到数组末尾 并返回修改后数组的长度 改变了原来的数组 vararr 2 3 4 arr push 5 hello 6 8 参数可以是数值 字符 数组 console log arr 方法二 在数组末尾添加元素在数组末尾添加元素可以通过数组名

    2026年3月18日
    2
  • 华为 海思优盘热插拔处理

    华为 海思优盘热插拔处理点此进入原文链接在海思录像的时候一般大家都是使用硬盘和优盘来存储视频的 硬盘一般都是固定在设备上的 而优盘很多情况下是要支持热插拔的 那么怎么来实现呢 如图所示 在插拔优盘的时候系统会出现一系列打印信息 remove 表示的就是优盘拔出的时候的打印 而 add 打印就是再优盘插入时的打印 我们可以在程序里检测系统的打印消息 再用回调函数来做挂载和卸载之类的处理 就可以实现优盘的热插拔录像拉 易百纳技术社区内容涵盖半导体 图像处理 人工智能 物联网 工业板卡以及通用硬件等多个领域 已成为一个多系列 如

    2026年3月18日
    2
  • unity支持python语言吗_scratch三维立体

    unity支持python语言吗_scratch三维立体在上次发布拙作后,有不少童鞋询问本人如何学习Unity3D。本人自知作为一名刚入门的菜鸟,实在没有资格谈论这么高大上的话题,生怕误导了各位。不过思来想去,决定还是写一些自己的经验,如果能给想要入门U3D的您一些启发,便再好不过了。如何入门谈起自己是如何入门U3D,这还得从一年半前说起。那是在一个月黑风高的夜晚…(此处省略一万字)。就这样,我对这款游戏引擎产生了浓厚的兴趣,走上了自学的道路。相比…

    2022年8月10日
    6
  • java中hashcode的用法_javahashcode作用

    java中hashcode的用法_javahashcode作用hashcode()是干什么用的?首先hashcode是哈希算法的一中简单实现,他是一个对象的哈希吗值。一般和equals一起使用。 hashcode也是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 例如内存中有这样的位置 01234567 而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,

    2025年8月28日
    8
  • 什么是深浅拷贝?如何实现深浅拷贝

    什么是深浅拷贝?如何实现深浅拷贝什么是深浅拷贝 如何实现深浅拷贝首先 先了解深浅拷贝的含义 浅拷贝就是通过赋值的方式进行拷贝 那为什么说这是浅拷贝呢 就是因为赋值的方式只会把对象的表层赋值给一个新的对象 如果里面有属性值为数组或者对象的属性 那么就只会拷贝到该属性在栈空间的指针地址 新对象的这些属性数据就会跟旧对象公用一份 也就是说两个地址指向同一份数据 一个改变就会都改变 深拷贝则不会出现上述问题 引用数据类型 地址跟数据都会拷贝出来 浅拷贝让我们先来看看浅拷贝 代码走你 letperson uname 张

    2026年3月17日
    2

发表回复

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

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