- 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支持多种结构。
分隔符 |
描述 |
\n |
对于文本文件来说,每行都是一条记录,因此换行符可以分割记录 |
^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都极力尝试尽可能地将各种错误恢复过来。