Hive 数据类型 与 案例实操

Hive 数据类型 与 案例实操

基本数据类型

Hive数据类型 Java数据类型 长度 示例
TINYINT byte 1byte 有符号整数 20
SMALLINT short 2byte 有符号整数 20
INT int 4byte 有符号整数 20
BIGINT long 8byte 有符号整数 20
BOOLEAN boolean 布尔类型,true或false TRUE
FLOAT float 单精度浮点数 3.14
DOUBLE double 双精度浮点数 3.14
STRING string 字符系列,可指定字符集,可使用单引号或双引号 ‘now’ “now time”
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()
{
    "name": "John Doe",
    "salary": 100000.0 ,
    "subordinates": ["Mary Smith" , "Todd Jones"] ,   //列表Array, subordinates[1]="Tood Jones"
    "deductions": {                                  //键值Map, deductions['Federal Taxes']=0.2
        "Federal Taxes": 0.2 ,
        "State Taxes": 0.05,
        "Insurance": 0.1
    }
    "address": {                                     //结构Struct, address.city="Chicago"
        "street": "1 Michigan Ave." ,
        "city": "Chicago" ,
        "state": "IL" ,
        "zip": 60600
    }
}

案例实操

数据

基于上面的json数据结构,我们在Hive里创建对应的表,并导入数据。
创建本地文件text.txt

[root@hadoop101 datas]# pwd
/opt/module/hive-1.2.1/datas
[root@hadoop101 datas]# cat text.txt 
John Doe,100000.0,Mary Smith_Todd Jones,Federal Taxes:0.2_State Taxes:0.05_Insurance:0.1,1 Michigan Ave._Chicago_1L_60600
Tom Smith,90000.0,Jan_Hello Ketty,Federal Taxes:0.2_State Taxes:0.05_Insurance:0.1,Guang dong._China_0.5L_60661

建表

Hive上创建测试表test

CREATE  TABLE text(
name STRING,
sa1ary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '_'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';

字段解释:

字段 解释 备注
row format delimited fields terminated by ‘,’ 列分隔符 表中存储是列分隔符
collection items terminated by ‘_’, MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
map keys terminated by ‘:’ MAP中的key与value的分隔符
LINES TERMINATED BY ‘\n’ 行分隔符 默认’\n’

导入本地数据

hive (default)> load data local inpath '/opt/module/hive-1.2.1/datas/text.txt' overwrite into table text;
Loading data to table default.text
Table default.text stats: [numFiles=1, numRows=0, totalSize=234, rawDataSize=0]
OK
Time taken: 2.325 seconds

查询

hive (default)> select * from text;
OK
text.name       text.sa1ary     text.subordinates       text.deductions text.address
John Doe        100000.0        ["Mary Smith","Todd Jones"]     {"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}        {"street":"1 Michigan Ave.","city":"Chicago","state":"1L","zip":60600}
Tom Smith       90000.0 ["Jan","Hello Ketty"]   {"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}        {"street":"Guang dong.","city":"China","state":"0.5L","zip":60661}
Time taken: 0.614 seconds, Fetched: 2 row(s)
hive (default)> select name,subordinates[0],deductions['State Taxes'],address.city from text;
OK
name    _c1     _c2     city
John Doe        Mary Smith      0.05    Chicago
Tom Smith       Jan     0.05    China
Time taken: 0.175 seconds, Fetched: 2 row(s)

类型转化

Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换。

例如某表达式使用 INT 类型,TINYINT 会自动转换为 INT 类型,但是 Hive 不会进行反向转化,例如, 某表达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使 用 CAST 操作。

隐式类型转换规则

(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换 成 INT,INT 可以转换成 BIGINT。
(2)所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。
(3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。
(4)BOOLEAN 类型不可以转换为任何其它的类型。

显式数据类型转换

可以使用 CAST 操作显式进行数据类型转换。
例如 CAST(‘1’ AS INT)将把字符串’1’ 转换 成整数 1;如果强制类型转换失败,返回空值 NULL。

Hive 数据类型 与 案例实操_第1张图片

参考

Hive集合数据类型
Hive数据类型转换

你可能感兴趣的:(Hive,Hive学习笔记)