2.数据类型和文件格式

基本数据类型

  • hive支持不同长度的整形和浮点型数据类型,支持布尔类型,也支持无长度限制的字符串类型。

  • Hive的属性不支持定长的记录,关系型数据库支持定长的记录更适合创建索引,数据扫描等。

  • TIMESTAMP可以是整数,是距离Unix新纪元时间的秒数,也可以浮点数,也可以是字符串,格式为YYYY-MM-DD hh:mm:ss.ffffffff,表示的为UTC时间,Hive提供时区转换函数,to_utc_timestamp和from_utc_timestamp函数

  • BINARY属性类型和mysql中的VARBINARY类似,但其的BLOB数据类型不同,因为BINRAY的列是存储在记录中,而BLOB则不同。BINARY可以记录中包含任意字节,这样可以防止Hive尝试将其作为数字,字符串等进行解析。

  • cast(s AS int) 将字符串转换为整数类型。

集合数据类型

  • hive支持struct,map和array集合数据类型。

  • 传统数据库一般不支持结构化数据,不遵循标准格式的一个好处就是可以提供更高吞吐量的数据。

# 创建结构化表 
create table employees( 
    > name STRING, 
    > salary FLOAT, 
    > dedyctuibs ARRAY<STRING>, 
    > address STRUCT<street:String,city:string>); 
  • struct一旦定义好结构就无法改变,类似于java的一个domain,并且struct支持多种结构。

文本文件数据编码

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

分隔符描述

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

^A

对于分割字段(列),在Create table语句中可以使用八进制编码\001表示

^B

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

^C

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

指定其他分隔符

create table employees( 
    > name STRING, 
    > salary FLOAT, 
    > test MAP<STRING,FLOAT>, 
    > dedyctuibs ARRAY<STRING>, 
    > address STRUCT<street:String,city: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需要写在其他子句之前,字符\001是^A的八进制数,FIELDS TERMINATED BY '\001'表示Hive将使用^A作为列分隔符 
COLLECTION ITEMS TERMINATED BY '\002'表示Hive将使用^B作为集合元素之间的分隔符 
MAP KEYS TERMINATED BY '\003'表示Hive用^B作为MAP键和值间的分隔符 
LINES TERMINATED BY '\n'和STORED AS TEXTFILE不需要ROW FORAMT DELIMITED关键字,LINES TERMINATED BY '\n'表示行与行之间的分隔符只能是"\n",STORED AS TEXTFILE是文件存储格式。 

读时模式

  • 当用户向传统数据库中写入数据时,不管采用何种装载外部数据方式,还是采用将一个查询的输出结果写入方式,或者使用UPDATE语句等等,数据库对于存储都具有完全的控制力。传统数据库是写时模式,即数据在写入时对模式进行检查 。

  • Hive底层存储没有这样的限制,对于Hive要查询的数据有很多方式对其进行创建、修改、甚至损坏。Hive不会再数据加载时验证,而是在查询时进行,这就是读时模式 。

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

最后更新于