hive开发1--数据类型及编码格式

Posted 破产DBA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive开发1--数据类型及编码格式相关的知识,希望对你有一定的参考价值。


hive内置数据类型包括基础数据类型和复杂数据类型, 基础类型包括数字,字符,时间类型, 复杂类型包括ARRAY,MAP,STRUCT,UNION,了解hive常用类型参数对后续的开发会有很大帮助.


1.数字类型

数字类型常用函数

  • Floor--“地板”,向下取整

  • Ceiling--“天花板”,向上取整

  • Round--四舍五入

hive开发1--数据类型及编码格式

2.时间类型

  • TIMESTAMP

  • DATE

  • INTERVAL

时间常用函数

  • 取值年月日时:month, day, year, hour

  • current_date() 当前日期

  • current_timestamp() 当前日期时间

  • to_date  返回时间中的日期部分(年月日)

  • weekofyear 返回时间字段是本年的第多少周

  • datediff(string enddate,string begindate) 返回enddate与begindate之间的时间差的天数

  • date_add(string date,int days)返回date增加days天后的日期

  • date_sub(string date,int days) 返回date减少days天后的日期

timestamp函数

  • 返回当前时间的timestamp

select unix_timestamp()

  • 返回指定时间的timestamp值

select unix_timestamp('1971-01-18 22:42:08','yyyy-mm-dd HH:mm:ss');

  • 转换成date

select from_unixtime(33057729);

3.INTERVAL类型

INTERVAL数据类型表示时间的间隔, 不能直接用于表字段类型定义, 不过可以用于计算时间值:

select sdate+INTERVAL '1' DAY  from tb2;

select sdate+INTERVAL '1-2' YEAR TO MONTH  from tb2;

常用interval类型:

INTERVAL '1 2:3:4.000005' DAY  表示1天2小时3分钟4秒5纳秒

INTERVAL '1' DAY/hour/minute/second  

INTERVAL '1-2' YEAR TO MONTH  1年2个月

4.字符类型

  • STRING 单引号或双引号都可以,可以指定字符集

  • VARCHAR --最大65535

  • CHAR --最大255

5.其他及复杂类型

  • BOOLEAN --布尔类型

插入任意数字都是true;可以插入true,false值,具体hdfs存储的文件也是true,false字符串, 实际使用建议用int代替,减少实际存储空间.

复杂类型

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

  MAP:MAP包含key->value键值对,可以通过key来访问元素。比如”userlist”是一个map类型,其中username是key,password是value;那么我们可以通过userlist['username']来得到这个用户对应的password;

  UNION: UNIONTYPE,他是从Hive 0.7.0开始支持的。


  • arrays

坑爹的是, 不能直接插入 [1,2,3]类似的数组, 需要使用select函数插入:

CREATE TABLE `tb10`(`colr` array<int>)

insert into tb10 select array(122,133,144);

hive> select * from tb10;

[122,133,144]


  • map

hive> create table tb11(colmap map<int,string>);

map类型可以通过insert语句插入数据,map类型无法通过values指定插入值,必须通过select生产表数据插入;

在实际操作过程中发现hive 2.1.0存在1个问题,无法通过下述方法插入,而hive2.3.2是可以的:

hive2.1.0报错:

Error: Error while compiling statement: FAILED: ParseException line 1:32 Failed to recognize predicate '<EOF>'. Failed rule: 'regularBody' in statement (state=42000,code=40000)

hive2.3.2成功执行:

hive> insert into tb11 select map(1,'a',2,'b');

hive> select * from tb11;

{1:"a",2:"b"}

map注意事项:

!!

尽量避免map类型中使用decimal,double,float, 会很痛苦的,甚至必须要指定长度的decimal!!!!

以下是经常遇到的map类型处理时遇到的错误:

  • decimal(4,1)无法转换成decimal(10,0)

Cannot convert column 0 from map<string,decimal(4,1)> to map<string,decimal(10,0)>

  • int无法转换成double

Cannot convert column 0 from map<string,int> to map<string,double>

  • decimal(2,1)无法转换成double

Cannot convert column 0 from map<string,decimal(2,1)> to map<string,double>

  • varchar无法转换成string!!?

Cannot convert column 0 from map<int,varchar(100)> to map<int,string>

所以在使用map时请只使用简单的格式,如int,varchar,string便于转换的


  • structs

传统数据模型中, struct可能需要多个不同的表拼接而成, struct的使用会增大数据冗余的风险,然而在大型数据系统中,不遵循标准可以提供更高吞吐量的数据

一旦声明struct结构,其位置就不可以再改变

CREATE TABLE `tb12`(

 `colstr` struct<name:string,sex:boolean,age:int>)

insert into tb12 select named_struct("name","fanmeng","sex",true,"age",12);需要注意的是, insert表时,struct字段需要对应表中对应的struct列名称, 否则会报错,所以此处使用了1个比较特殊的函数named_struct,此函数是用逗号隔开KV值的.

hive开发1--数据类型及编码格式


  • union

不建议使用, 官方文档也注明此类型在join,where,group by中会出现错误

The UNIONTYPE datatype was introduced in Hive 0.7.0 (HIVE-537), but full support for this type in Hive remains incomplete. Queries that reference UNIONTYPE fields in JOIN (HIVE-2508), WHERE, and GROUP BY clauses will fail, and Hive does not define syntax to extract the tag or value fields of a UNIONTYPE. This means that UNIONTYPEs are effectively look-at-only.

6.数据存储及编码

hive支持自定义元数据格式,比如逗号分隔,tab分隔等等,这种强大的自定制功能很容易使用hive处理ETL程序产生的文件.

hive中默认的记录和字段分隔符

分隔符

描述

\n

对于文本文件来说,每行都是一条记录,因此换行符可以分隔记录

^A(Ctrl+A)

用于分隔字段(列)。在CREATE TABLE语句中可以使用八进制编码\001表示

^B(Ctrl+B)

用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码\002表示

^C(Ctrl+C)

用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码\003表示

create table可以指定分隔符

Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:

  • 列分隔符(通常为空格、\t、\x001)

  • 行分隔符(\n)

  • 读取文件数据的方法。

由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。

 create table table_example_1

(

id int,

name varchar(100),

deptname array<string>,

coures map<string,decimal(5,2)>,

address struct<country:string,province:string,city:string>

)

row format delimited  

fields terminated by '\001'     --字段间分隔符

collection items terminated by '\002'  --集合间元素分隔符

map keys terminated by '\003'      --map内部元素分隔符

lines terminated by '\n'            --换行符

stored as textfile;

插入测试:

insert into table_example_1

select 1,"name",array("研发","测试"),map("语文",901.12,"数学",121.32),named_struct("country","中国","province","北京市","city","北京市朝阳区")

数据验证—读时模式

hive只会在查询的时候进行验证,如果字段数量不匹配,或字段类型不一致, hive将返回null值;

数据转换

注意: 基础类型按下述转换没问题, 复杂类型很多都不能正常的转换



以上是关于hive开发1--数据类型及编码格式的主要内容,如果未能解决你的问题,请参考以下文章

查看mysql数据库及表编码格式

如何查看文件编码格式?

HIVE数据类型及存储格式

查看mysql数据库及表编码格式

查看mysql数据库及表编码格式

数据库中表及字段的编码设置