1)
表的分区
大数据开发数据量较大,在进行数据查询计算时,需要对数据进行拆分,提升查询速度。
1-1 单个分区
单个分区时创建单个目录
1-2 多个分区
多个分区可以将数据拆分多个目录储存
注意点: 1 分组字段不能和表中字段重名
2 动态分区数据写入时,select中字段顺序要和分区表中字段顺序一致
3 分区字段在最后,所有select中的分区数据指定也放在最后
2)
1-1
表的分桶
分区:将数据拆分不同目录下存储
分桶:将数据拆分成不同文件进行存储
无论是分区还是分桶,本质都是对数据的拆分存储,作用是为了提升查询的效率
分桶表可以在进行数据写入时,根据写入数据的不同拆分到不同文件进行存储,在查询数据时,就可以读取不同文件获取数据
分桶的数据字段可以自己指定,分桶的数量,也就是拆分文件的数量也可以自己指定
2-1
分桶创建
格式:
create table 表名 ()clustered by (选择分桶的字段) into (选择分成几个通)buckets
row format delimited fields terminated by ‘分隔符’;
使用分桶时,一般都是已经存在了一个原始数据表,为了提升原始数据速度,将原始数据在重新写入一个分桶表
2-2
分桶原理说明
数据按照hash取余的方式进行拆分,写入到不同的文件中
逻辑 :hash(分桶字段)%分桶数 = 余数 hash方法互怼任意数据进行计算后得到一个唯一编号值
2-3
分桶的主要使用场景
多表关联 提升多表关联的查询效率
随机采样
3)
数据文件的读取和写入
hive在对hdfs上的文件数据进行读取和写入数据时,
使用delimited 表示底层默认使用的serde类:LazySimpleSerDe类来处理数据
使用serde:表示指定其他的Serde类来处理数据,支持用户自定义SerDe类
3-1
默认序列化器
delimited
在进行表定义时指定row format delimited
指定处理不同数据的方法
fields terminated by 字段的处理方法 指定如何分隔字段
collection items terminated by 指定字段中数组的分割分割方式
map keys terminated by 指定map的数据分割方式
3-1-1 array类数据类型
create table 表名(
hoobby array <string>) .... collection items terminated by ',' ;
3-1-2 struct类型数据
create table 表名(
user struct <name:string,age:int,gender:string>) ....collection items terminated by '#'
第一步 先按照逗号拆分数据
第二部 在将数组类型数据 拆分
第三步 在对数组中的数据转为map形式
3-1-3 map类型数据
collection items terminated by '-'
map keys map keys terminated by ' : '
* : split (字段,’-‘) 字段内容转为数组
3-2
自定义序列化器
可以使用自定义序列化器中提供jar包完成对json数据的处理
可以将json文件中的数据key最为字段,将value值解析为对应的行数据
步骤:
按照json文件中的key定义表字段
顺序要一样
crearte table 表名 ()row format serde ’org.apche.hive.hcatalog.data.JsonSerDe‘ ;(指定三方的序列化器)
4 )
内置函数
hive提供的函数方法,方便对不同类型的字段数据进行操作
4-1 字符串操作函数
计算字符串长度 length(name)
字符串拼接 concat(字段,字段) 没有拼接字符
concat_ws(':', 字段,字段) 有拼接符
字符串切割 split(字段,’-‘) 数组取值
split(字段,’-‘)[0]
字符串截取 substr(字段,1,4) 起始的字符位置书,截取的字符个数
字符串替换 regexp_replace(字段,’-‘,’/‘)
方法嵌套使用
例如:
trim 去除字符串的前后空格
select 字段 ,subst(trim(字段)1,4)from 表名
4-2
数值操作
取余操作 select 2%5
取整操作 round () 保留多少位置 round(。。。,2) 保留两位
向上取整 ceil(3.14)
向下取整 floor (3.14)
次方计算 pow (2,3)
4-3
条件判断
单个条件判断
select gender,if(gender =0 ,’男‘,’女‘)from 表名 ---- 如果gender等于0则成立等于男,如果不是则是女
多个分类条件判断
case when
select age ,case when age <= 18 then '少年' when age >18 and age <=40 then ’青年‘ end as age_new from 表名
判断数据是否为空
if(字段 = null,’‘,’‘)
nullif(1,1) , nullif(1,2)
查看方法的使用形式 desc function extended nullif ;