Hive的基本操作3

3.1.9 Hive的数据类型与数据格式

Hive的数据类型有两种,一种是基本的数据类型,一种是复杂的数据类型。首先看一下Hive基本数据类型,第一个是数值型,如表2-1所示,

 

 

(1)Integral Types (TINYINT, SMALLINT, INT/INTEGER, BIGINT):默认情况下,整数型为INT型,当数字大于INT型的范围时,会自动解释执行为BIGINT,或者使用以下后缀进行说明。

(2)Decimals:Hive的小数型是基于Java BigDecimal的,BigDecimal在Java中用于表示任意精度的小数类型。所有常规数字运算(例如+、-、*、/)和相关的UDF(如Floor、Ceil、Round等)都使用和支持Decimal。可以将Decimal和其他数值型互相转换,且Decimal支持科学计数法和非科学计数法。因此,无论数据集是否包含如4.004E + 3(科学记数法)或4004(非科学记数法)或两者的组合的数据,都可以使用Decimal。

从Hive 0.13开始,用户可以使用DECIMAL(precision, scale) 语法在创建表时来定义Decimal数据类型的precision和scale。 如果未指定precision,则默认为10。如果未指定scale,将默认为0(无小数位) 

CREATE TABLE foo (

a DECIMAL, – Defaults to decimal(10,0)

b DECIMAL(9, 7)

)

大于BIGINT的数值,需要使用BD后缀及Decimal(38,0)来处理,如 

select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1; 

Decimal在Hive 0.12.0和0.13.0之间是不兼容的,故0.12前的版本需要迁移才可继续使用。

基本类型中除了数值型,还有日期型,关于日期型以及支持版本,如表2-2所示,

 

(1)Timestamps

支持传统的UNIX时间戳和可选的纳秒精度。

- 支持的转化

- 整数数字类型:以秒为单位解释为UNIX时间戳

- 浮点数值类型:以秒为单位解释为UNIX时间戳,带小数精度

- 字符串:符合JDBC java.sql.Timestamp格式“YYYY-MM-DD HH:MM:SS.fffffffff”(9位小数位精度)

时间戳被解释为无时间的,并被存储为从UNIX纪元的偏移量。提供了用于转换到和从时区转换的便捷UDF(to_utc_timestamp,from_utc_timestamp)。

所有现有的日期时间UDF(月,日,年,小时等)都使用TIMESTAMP数据类型。

Text files中的时间戳必须使用格式yyyy-mm-dd hh:mm:ss [.f …]。如果它们是另一种格式,请将它们声明为适当的类型(INT,FLOAT,STRING等),并使用UDF将它们转换为时间戳。

在表级别上,可以通过向SerDe属性“timestamp.formats”(自版本1.2.0 with HIVE-9298)提供格式来支持备选时间戳格式。例如,yyyy-MM-dd’T’HH:mm:ss.SSS,yyyy-MM-dd’T’HH: mm:ss。

(2)Dates

DATE值描述特定的年/月/日,格式为YYYY-MM-DD。例如,DATE'2013-01-01'。日期类型没有时间组件。Date类型支持的值范围是0000-01-01到9999-12-31,这取决于Java Date类型的原始支持。

Date types只能在Date, Timestamp, or String types之间转换,转换类型及结果如表2-3所示。

 

 

 

(3)Intervals

时间间隔在1.2.0之后版本支持,在2.2.0版本上进行了扩展。

第三种最常提及的基本类型是字符型,字符型包含三种,分别是:(1)String:字符串文字可以用单引号(')或双引号(")表示。Hive在字符串中使用C风格的转义。(2)Varchar:Varchar类型使用长度说明符(介于1和65355之间)创建,它定义字符串中允许的最大字符数。如果要转换/分配给Varchar值的字符串值超过length说明符,则字符串将被静默截断。字符长度由字符串包含的代码点的数量确定。像字符串一样,尾部空格在Varchar中很重要,并且会影响比较结果。非通用UDF不能直接使用Varchar类型作为输入参数或返回值。可以创建字符串UDF,而Varchar值将被转换为strings并传递到UDF。要直接使用Varchar参数或返回Varchar值,请创建GenericUDF。如果基于reflection-based方法来获取数据类型信息,则可能存在不支持Varchar的场景。 这包括一些SerDe函数实现。(3)Char:字符类型与Varchar类似,但它们是固定长度的,意味着比指定长度值短的值用空格填充,但尾随空格在比较期间不重要。最大长度固定为255。

了解到基本的数据类型之后,再来看看复杂数据类型都包括哪些。如表3-1所示,

 

注:UNIONTYPE目前还没有完全支持,官方建议只用于查看,详见官方文档。

(1)ARRAY: ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由[‘apple’,’orange’,’mango’]组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的;

关于ARRAY的具体操作步骤如下,

首先准备数据:具体数据以及格式如下,

1 football,basketball,tabletannis tom

2 music,movie tomas

然后使用create关键字创建基础表,并且按照数据的格式来使用分隔符,创建表之后可以使用desc关键字来查看该表的表结构,具体代码如下,

create table arrtest(id int,hobbies<string>,name string) row format delimited fields<

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值