hive 数据类型和文件格式

hive 基本数据类型
hive的基本数据类型

1、和标准的sql语言类似,这些关键字为h-sql 的保留字。
2、所有的这些数据类型都是java中的接口是实现,因此这些类型的具体细节和java中对应的类型完全一致。例如,STRING类型实现的是java中的String,FLOAT 实现的是java中的float
3、hive 中不支持"字符数组"类型。传统关系型数据库,字符数组主要出于性能优化的考虑。因为定长的记录更容易进行建立索引,数据扫描,等等。在hive所处的"宽松"的世界里,不一定拥有数据文件但必须支持使用不同格式的文件格式,Hive 根据不同字段间的分隔符来对其进行判断。同时,Hadoop 和 Hive 强度优化磁盘的读和写的性能,而限制列的值的长度相对来说并不是很重要
4、新增数据类型TIMESTAMP的值
    可以是整数,即当前时间距离(1970年1月1日00:00:00) 的秒数
    可以是浮点数,即当前时间距离(1970年1月1日00:00:00) 的秒数,精确到纳秒(小数点后保留9位数)
    可以是字符串,即JDBC所约定的时间字符串格式,格式为:YYYY-MM-DD hh:mm:ss.fffffffff
    TIMESTAMPS 表示的是UTC 时间。Hive 本身提供了不同时区间互相转换的内置函数,也就是to_utc_timestamp 函数和 from_utc_timestamp。这两个函数后续会说明
5、BINARY 的列存储在记录中,可以在记录中保护任意的字节,这样可以防止hive尝试将其作为数字、字符串等进行解析
    注意:如果用户的目标是省略掉每一行记录的尾部,那么无需使用BINARY 数据类型的。如果一个表的结果是3列,而实际数据文件每行包含5个字段,那么在Hive中最后2列数据会被省略
    一个float类型的列和一个double类型的列做对比,hive会隐式的将float类型的列转换成double类型。如果有必要,Hive在对两列做比较的时候会将任意的数据类型隐式的转换成double类型
    两种整型类型的值做对比,Hive 会隐式的将类型转换为两个整型类型中值较大的那个类型。如:SMALINT 和 INT 这两种类型的值做对比,Hive会将SMALINT 隐式转换成INT,然后在做对比
    如果用户希望将一个字符串类型的列转换成数值类型,这种情况需要用户显示地将一种数据类型转换成另一种数据类型。

hive 集合数据类型
hive集合数据类型

传统的关系数据库不支持这些集合的数据类型,struct可能需要多个不同的表拼装而成,表间需要适当使用外键来进行连接。如果使用集合的数据类型,会增大数据的冗余的风险,进而导致消化不必要的磁盘空间,还有可能造成数据不一致,因为当数据发送改变时冗余的拷贝数据可能无法进行相应的同步
大数据环境下,不遵循标准的格式的一个好处可以提供更高吞吐的数据,当处理数据的量级是T或者P,以最少的"头部寻址"来从磁盘上扫描数据是非常必要的。按数据集进程封装的话可以通过减少寻址次数来提供查询的速度,而如果根据外键关系关联的话则需要进行磁盘间的寻址操作,这样会有非常高的性能消耗
具体h-sql 语言实现这些集合数据类型的示例:
    CREATE TABLE employyess (
        name            STRING,
        salary          FLOAT,
        subordinates    ARRAY<STRING>,
        deductions      MAP<STRING,FLOAT>
        address         STRUCT<street:STRING,city:STRING,zip:INT>);
    name:是简单的字符串类型
    salary(薪水):使用浮点数类型表示
    subordinates(下属员工)列表是一个字符串值数组
        在该数组中,我们可以认为name 是"主键",因此subordinates 中的每一个元素都会引用这张表中的另一条记录。
        ARRAY<STRING> 表示每个元素都是STRING类型
        对于没有下属员工,这个字段对应的值就是一个空值
    字段 deductions 是一个由键-值对构成的map,其记录了每一次的扣除额,这些钱会在发薪水的时候从员工的工资中扣除掉。
        map中的键是扣除金额项目的名称(例如:国税),而且键可以是一个百分比,也可以完全就是一个数值
        map<STRING,FLOAT> key:STRING value:FLOAT
    address这个字段是每名雇员的家庭地址,使用struct数据类型存储,其中的每个域都命名并且具有一个特定的类型
        STRUCT 一旦声明好了,那么位置就不可以在改变

文件编码
CSV 字段之间是以逗号分隔文本文件
TSB 字段之间是以制表符分隔的文本文件
hive处理这两类文本文件尤为要注意的是:那些逗号或者制表符不是分隔符
hive中默认的记录和字段的分隔符
\n:对于文本文件来说,每一行都是一条记录,因此换行符可以分割记录
^A (ctrl+A):用于分割字段(列)。在CREATE TABLE 语句中可以使用八进制编码\001 表示
^B(ctrl+B):用于分割ARRARY或者STRUCT中的元素,或用于MAP中键-值对之间的分割付。在CREATE TABLE 语句中可以使用八进制编码\002 表示
^C(ctrl+C):用于MAP中键和值之间的分割。在CREATE TABLE 语句中可以使用八进制编码\003表示

传统关系数据库使用的是写时模式,hive使用的是读时模式
写时模式(schema on write):写数据的时候进行对数据的检查(检查数据类型,一致性,索引等)
优点:读非常快
缺点:写速度很慢
读时模式(schema on read):读数据的时候进行对数据的检查
优点:写数据很快,load data 效率高
缺点:读数据比较慢,需要检查数据,解析字段和schema

在查询的时候发现数据类型不匹配一般情况下会返回null
在查询的时候发现每行记录中字段个数少于对应表中定义的字段个数的话,hive会返回很多null
除上述两种情况外,hive一般都会极力尝试尽可能地将各种错误恢复过来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值