Hive
作者:互联网
一. hive中的数据类型
hive中的数据类型主要分为:
(1)基本数据类型
1.数值型:主要就是用来保存数字
整数型
tinyint :1字节
smallint :2字节
int :4字节
bigint :8字节
浮点型
float :4字节
double :8字节
2.字符串类型
String,长度可变的字符串
3.布尔类型
boolean
4.时间类型
date:大时间类型,一般只保存年月日
timestamp:时间戳类型,可以精确到毫秒和纳秒
(2)复杂数据类型:
1.array:数组,用来保存一组相同数据类型的数据的集合
数组元素:数组中保存的每一个数据叫做数组元素
数组长度:数组中保存元素的个数
在hive中数组使用[]来表示
在hive中建表的时候数组的定义语法:
字段名 array<数据类型>
2.map:字典,集合
主要用来保存一对数据,里面保存的数据都要成对出现,键值对
在hive中建表的时候map字典的定义语法:
字段名 map<数据类型,数据类型>
3.struct:结构体,功能类似于c语言中的结构体
在创建表的时候必须要将键设置好
在hive中建表的时候struct字典的定义语法:
字段名 struct<键:数据类型,键:数据类型,...>
例如: (city:"深圳市") 获取键对应的值:结构体名.键 二. hive中建表方式 (1)语法: create [extarnal] tabl [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段名 数据类型 ... ... ) row format delimited fields terminated by '分隔符'; 用来设置列之间的分隔符 collection items terminated by '分隔符' 用来设置数组,集合,结构体中的元素之间的分隔符 map keys terminated by '分隔符' 用来设置map集合中键和值之间的分隔符 stored as 文件存储方式 用来设置文件的存储方式 location '数据文件存放的位置' 设置数据文件存放的路径 注意:如果在创建表的时候指定了location,则在hdfs上不会产生一个表名对应的文件夹 也就是说没有设置location的时候,代表没有给表 (2)文件的存储方式 1. textfile:hive中默认的存储方式 缺点:不会压缩数据,磁盘开销大,进行数据解析时开销也比较大,可以借助于Gzip或Bzip等压缩方式,但是无法分块。 优点:由于对数据不会进行压缩计算,所以在使用该种方式保存数据的时候不会启用MR程序,所以速度比较快 数据加载支持方式:put 和 load 2. sequencefile: 优点:使用二进制进行存储数据,使用比较方便,并且支持对数据进行切块,整体效率比较高,也可以对数据进行压缩 数据加载方式:由于要对数据进行压缩处理,所以要启动MR程序,不能使用 put 和 load,必须先创建一个中间表, 然后将元数据使用textfile的方式加载到中间表,然后再从中间表中查询出来添加到当前表中 3. rcfile: 会将数据按照进行切块,然后每一块中的数据再按照列存储,可以保证同一行的数据不会保存到不同块中,所以在查询的时候就避免了多个块之间进行查询数据,效率比较高 4. orcfile: 是在hive0.11版本中添加进来的,是rcfile的升级版,存储方式和rcfile一样 5. parquet: 类似于orc 注意:由于2,3,4,5都会对数据进行压缩处理,所以数据加载方式都和第二种一样 压缩比率排序:orcfile>parquet> 有列表时语法: create [extarnal] tabl [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段名 array<数据类型> ... ... ) row format delimited fields terminated by '分隔符' collection items terminated by '分隔符'; 有map时的语法: create [extarnal] tabl [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段名 map<数据类型,数据类型> ... ... ) row format delimited fields terminated by '分隔符' collection items terminated by '分隔符' map keys terminated by '分隔符'; hive 中表结构的查看 desc 表名:简单查看表列名以及数据类型 desc formatted 表名:查看完整的表结构信息 (3)内部表和外部表: 内部表特征: 1. 在创建表的时候不需要设置external关键字 2. 如果表创建的时候没有设置location,在删除时会将hdfs上的数据文件以及表对应的文件夹删除 使用场景:一般在使用的过程中,将一些临时文件或者是中间文件创建为内部表 外部表特征: 1. 在创建表的时候需要设置external关键字 2. 在删除外部表的时候,只会删除hive中对应表的结构,并不会删除所对应的文件夹以及数据文件 使用场景:一般在项目中一些ods层的原始数据一般都使用外部表进行创建 内部表和外部表之间的转换: 语法:alter table 表名 set tblproperties('EXTERNAL' = 'FALSE') 转换为内部表 alter table 表名 set tblproperties('EXTERNAL' = 'TRUE') 转换为内部表 (4)表中加载数据的方式 1. 使用put命令 主要就是将本地的文件加载到hdfs平台 语法:hdfs dfs -put 本地文件地址 hdfs上文件的地址 注意:该命令必须要在linux平台中进行执行 2. 使用load命令 语法:load data [local] inpath '数据文件路径' into table 表名; 注意:load 命令必须要在hive中执行,local代表加载的数据文件是本地文件,如果不写local则代表加载数据文件从hdfs上加载 以上两种方式加载数据的时候都不会启用MR程序 3. 使用 insert into 方式 语法:insert into 表名 select 语句; 追加数据 insert overwrite table 表名 select 语句; 覆盖数据 注意:使用 insert 加载数据的时候会启用MR程序 注意:hive 表中的数据只支持新增和查询,不能执行delete和update 如果要删除和修改表中的某一个数据,只能去数据文件进行修改 三. hive中的表分区 hive 中也可以进行表分区,是用来提高查询效率 一般情况下,一个表中的数据量比较大的时候建议使用分区 hive中的分区主要是分文件夹 hive中的分区分类 1. 静态分区 语法: create [external] table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段名 数据类型 ... ... )partitioned by (分区名 数据类型,分区名 数据类型,......) row format delimited fields terminated by '分隔符'; 用来设置列之间的分隔符 collection items terminated by '分隔符' 用来设置数组,集合,结构体中的元素之间的分隔符 map keys terminated by '分隔符' 用来设置map集合中键和值之间的分隔符 stored as 文件存储方式 用来设置文件的存储方式 location '数据文件存放的位置' 设置数据文件存放的路径 注意:在创建分区表的时候,分区字段不能出现在create后面的括号,必须要写在partition by 后面 静态分区的时候,分区必须要在添加数据的时候手动设置 2. 动态分区 在加载数据的时候会根据指定分区的字段的值来动态创建不同的分区文件夹 由于动态分区需要对数据进行计算处理,所以必须要启用MR程序,因此在加载数据的时候要使用insert into 在hive中使用动态分区则需要设置以下参数: --打开hive动态分区 set hive.exec.dynamic.partition=(true/false); 开启/关闭 --设置最多可以设置多少个动态分区(默认为1000) set hive.exec.max.dynamic.partitions; --设置每一个MR节点上最大可以有多少个动态分区(默认为100) set hive.exec.max.dynamic.partitions.pernode; --设置分区的模式 set hive.exec.dynamic.partition.mode=(nonstrict/strict); 非严格模式/严格模式 在严格模式下进行动态分区必须设置一个静态分区标签:分区,数据类型,hive,Hive,分隔符,数据,字段名 来源: https://www.cnblogs.com/LuoYB/p/16399730.html