Hive03-数据类型

NiuMT 2020-07-03 20:58:30
Hive

基本数据类型

Hive 数据类型 Java 数据类型 长度 例子
TINYINT byte 1byte 有符号整数 20
SMALINT short 2byte 有符号整数 20
INT int 4byte 有符号整数 20
BIGINT long 8byte 有符号整数 20
BOOLEAN boolean 布尔类型,true 或者 false TRUE、FALSE
FLOAT float 单精度浮点数 3.14
DOUBLE double 双精度浮点数 3.14
STRING string 字符系列。可以指定字符集。可以使用单引号或者双引号。 ‘now is the time’ “for all good men”
TIMESTAMP 时间类型
BINARY 字节数组

对于Hive 的String 类型相当于数据库的varchar 类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。

集合数据类型

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

Hive 有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY 和MAP 与Java 中的Array 和Map 类似,而STRUCT 与C 语言中的Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

案例:

{
    "name": "songsong",
    "friends": ["bingbing" , "lili"] ,    //列表 Array,
    "children": {    //键值 Map,
        "xiao song": 18 , 
        "xiaoxiao song": 19
    }
    "address": {    //结构 Struct,
        "street": "hui long guan" , 
        "city": "beijing"
    }
}

基于上述数据结构,我们在Hive 里创建对应的表,并导入数据。

  1. 创建本地测试文件 test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing 
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing

注意:MAP,STRUCT 和ARRAY 里的元素间关系都可以用同一个字符表示,这里用“_”。

  1. Hive 上创建测试表 test:
create table test( 
name string, 
friends array<string>, 
children map<string, int>, 
address struct<street:string, city:string> ) 
row format delimited  fields terminated by ',' #  -- 列分隔符
collection items terminated by '_'             # --MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
map keys terminated by ':'                     # -- MAP 中的key 与value 的分隔符 
lines terminated by '\n';                      # -- 行分隔符
  1. 导入文本数据到测试表:

hive (default)> load data local inpath “/opt/module/datas/test.txt” into table test;

  1. 访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT 的访问方式:

     hive (default)> select friends[1],children['xiao song'],address.city from test where name="songsong";
     OK
     _c0    _c1    city
     lili    18    beijing
     Time taken: 0.076 seconds, Fetched: 1 row(s)
    

类型转化

Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换,例如某表达式 使用 INT 类型,TINYINT 会自动转换为 INT 类型,但是 Hive 不会进行反向转化,例如, 某表达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使 用 CAST 操作。

隐式类型转换规则

使用 CAST 操作显示进行数据类型转换

例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数 1;

如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL。

算数运算符

运算符 描述
A+B A 和B 相加
A-B A 减去B
A*B A 和B 相乘
A/B A 除以B
A%B A 对B 取余
A&B A 和B 按位取与
A \ B A 和B 按位取或
A^B A 和B 按位取异或
~A A 按位取反

比较运算符

操作符 支持的数据类型 描述
A=B 基本数据类型 如果A 等于B 则返回TRUE,反之返回FALSE
A<=>B 基本数据类型 如果A 和B 都为NULL,则返回TRUE,其他的和等号(=)
操作符的结果一致,如果任一为NULL 则结果为NULL
A<>B,A!=B 基本数据类型 A 或者B 为NULL 则返回NULL;如果A 不等于B,则返回TRUE,
反之返回FALSE
A<B 基本数据类型 A 或者B 为NULL,则返回NULL;如果A 小于B,则返回TRUE,
反之返回FALSE
A<=B 基本数据类型 A 或者B 为NULL,则返回NULL;如果A 小于等于B,则返回TRUE,
反之返回FALSE
A>B 基本数据类型 A 或者B 为NULL,则返回NULL;如果A 大于B,则返回TRUE,
反之返回FALSE
A>=B 基本数据类型 A 或者B 为NULL,则返回NULL;如果A 大于等于B,则返回TRUE,
反之返回FALSE
A [NOT] BETWEEN B AND C 基本数据类型 如果A,B 或者C 任一为NULL,则结果为NULL。
如果A 的值大于等于B 而且小于或等于C,则结果为TRUE,
反之为FALSE。如果使用NOT 关键字则可达到相反的效果。
A IS NULL 基本数据类型 如果A 等于NULL,则返回TRUE,反之返回FALSE
A IS NOT NULL 基本数据类型 如果A 不等于NULL,则返回TRUE,反之返回FALSE
IN(数值1, 数值2) 基本数据类型 使用 IN 运算显示列表中的值
A [NOT] LIKE B 基本数据类型 B 是一个SQL 下的简单正则表达式,如果A 与其匹配的话,则返回TRUE;
反之返回FALSE。B 的表达式说明如下:‘x%’表示A必须以字母‘x’开头,
‘%x’表示A 必须以字母’x’结尾,而‘%x%’表示A 包含有字母’x’,可以位于开头,
结尾或者字符串中间。如果使用NOT 关键字则可达到相反的效果。
A RLIKE B, A REGEXP B 基本数据类型 B 是一个正则表达式,如果A 与其匹配,则返回TRUE;
反之返回FALSE。匹配使用的是JDK 中的正则表达式接口实现的,
因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A 相匹配,而不是只需与其字符串匹配。

逻辑运算符

操作符 含义
AND 逻辑与
OR 逻辑或
NOT 逻辑否