Hive数据类型和文件格式

Hive支持关系型数据库的大多数基本数据类型,同时也支持关系型数据库中很少出现的3种集合数据类型
为什么这么做?

  • 考虑因素一:数据类型是如何在文本中进行表示
  • 考虑因素二:文本存储中为了解决各种性能问题以及其他问题有哪些替代方案

基本数据类型

数据类型 长度 例子
TINYINT 1byte有符号整数 20
SMALINT 2byte有符号整数 20
INT 4byte有符号整数 20
BIGYINT 8byte有符号整数 20
BOOLEAN 布尔类型true或false TRUE
FLOAT 单精度浮点 3.14159
DOUBLE 双精度浮点 3.14159
STRING 字符序列,可以指定字符集。可以使用单引号或双引号 'string',"string"
TIMESTAMP 整数,浮点或者字符串 JDBC所兼容的时间格式
BINARY 字节数组 参考后面内容

所有的这些数据类型都是对Java中的接口实现,因此这些数据类型具体行为细节和Java中对应的数据类型是完全一致的。
如果用户在查询中将一个float和double进行比较,Hive会隐式地将类型转换为两个值中较大的类型,也就是把float转为double。
用户也可以显示地将一种数据类型转为其他一种数据类型,如:s = “1”,需要把s转为int则可以用

cast ( s as int)

as 和 int 是关键字,大小写都可以

集合数据类型

数据类型 描述 字面语法示例
STRUCT 和C语言中的stuct或者'对象'类似,都可以通过“点”符号访问元素内容。例如,如果某个列的元素类型是STRUCT{fisrt STRING,last STRING},那么第一个元素可以通过,字段名.first来引用 struct('John','Doe')
MAP MAP是一组键值对元组集合,使用数组表示法(例如['key'])可以访问元素。例如,某个列的数据类型是MAP,其中键->值对是'fisrt' -> 'John'和'last' -> 'Doe',那么可以通过字段名['last']获取最后一个元素 map('fisrt':'John','last':'Doe')
ARRAY 数组是一组具有相同类型和名称的变量集合。这些变量称为数组元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为['John','Doe'],那么第二个数组值可以用过数组名[1]进行引用 Array('John','Doe')

大多数的关系型数据库并不支持这些集合数据类型,因为使用它们会趋向于破坏标准格式。破坏标准带来的问题是会增大数据冗余风险,进而导致不必要的磁盘空间,还有可能造成数据不一致,因为当数据发生改变时冗余的拷贝数据可能无法进行相应的同步

这里有一个用于演示如何使用这些数据类型的表结构声明语句,这是一张虚拟的人力资源应用程序的员工表

CREATE TABLE employees(
       name STRING,
       salary FLOAT,
       subordinates ARRAY<STRING>,
       deductions MAP<STRING,FLOAT>,
       address STRUCT<street:STRING, city:STRING, state:STRING, zip:STRING> 
);

文本文件数据编码

常见的文本文件的格式,有以逗号和制表符分隔的文本文件,也就是所谓的逗号分隔值(CSV)或制表符分隔值(TSV)。只要用户需要,Hive是支持这些文件格式的。然而,这两种格式的文件有一个共同的缺点,那就是:

用户需要对文本文件中那些不需要作为分隔符处理的逗号或者制表符格外小心

也因此,Hive默认使用了几个控制字符,这些字符很少出现在字段值中。Hive使用术语field来表示替换分隔符的字符。
Hive中默认的记录和字段分隔符如下表:

分隔符 描述
\n 对于文本来说,每行都是一条记录,因此换行符可以分割记录
^A(Ctrl+A) 用于分割字段(列)。在CREATE TABLE 语句中可以使用八进制编码\001表示
^B 用于分割ARRAY或者STRUCT中的元素,或用于MAP中键值对之间的分割。在CREATE TABLE语句中可以使用八进制编码\002表示
^C 用于MAP中键和值之间的分割。在CREATE TABLE语句中可以使用八进制编码\003表示

我们看一下employees表中的记录,其中使用了^A等字符作为字段分割符:



用户可以不使用这些默认分隔符,而指定使用其他分隔符。下面这个表结构和和之前那个表是一样的,不过这里明确制定了分隔符:

CREATE TABLE employees(
       name STRING,
       salary FLOAT,
       subordinates ARRAY<STRING>,
       deductions MAP<STRING,FLOAT>,
       address STRUCT<street:STRING, city:STRING, state:STRING, zip:STRING> 
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

ROW FORMAT DELIMITED这组关键字必须要写在其他字句(除了 STORED AS ...)之前

读时模式

传统的数据库是写时模式(schema on write),即数据在写入数据库时对模式进行检查。
Hive对底层存储并没有这样的控制。Hive不会在数据加载时进行验证,而是在查询时进行,也就是读时模式。
那么如果模式和文件内容不匹配将会怎么样呢?

Hive对此做的非常好,因为其可以读取这些数据。如果每行记录汇总字段个数少于对应模式中定义的字段个数的话,那么用户将会看到查询结果中有很多null值。如果某些字段是数值型,但Hive在读取时发现存在非数值型的字符串值的话,那么对于那些字段将会返回null值。除此之外的情况,Hive都极力尝试尽可能将各种错误恢复过来

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容