【编程学习】Hive分布式数据库HQL基础语法
【编程学习】Hive分布式数据库HQL基础语法
6YoungHive宏参数设置
1 | 表示开启动态分区 |
Hive建表基础语法
1 | CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name |
全部使用默认建表方式
1 | create table students |
指定location
1 | create table students2 |
指定存储格式
1 | create table students3 |
Hive建立分区表
1 | create external table students_pt1 |
1 | alter table students_pt1 add partition(pt='20210904'); // 增加分区 |
1 | insert into table students_pt partition(pt='20210902') |
Hive分桶
什么是数据分桶
我们都知道,Hive是基于Hadoop的一个数据仓库,可将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。其实,Hive的本质是将HiveSQL语句转化成MapReduce任务执行。
Hive中,分区提供了一个隔离数据和优化查询的便利方式,不过并非所有的数据都可形成合理的分区,尤其是需要确定合适大小的分区划分方式(有的数据分区数据过大,有的很少,即我们常说的数据倾斜)
我们可以将Hive中的分桶原理理解成MapReduce中的HashPartitioner的原理。都是基于hash值对数据进行分桶。
MR:按照key的hash值除以reduceTask个数进行取余(reduce_id = key.hashcode % reduce.num)
Hive:按照分桶字段(列)的hash值除以分桶的个数进行取余(bucket_id = column.hashcode % bucket.num)
数据分桶的作用:
进行抽样:在处理大规模数据集时,在开发和修改查询的阶段,可以使用整个数据集的一部分进行抽样测试查询、修改。可以使得开发更高效。
map-side join:获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
代码
1 | create table students_buks |
分桶抽样查询
1 | select * from students_buks tablesample(bucket 1 out of 12 on class) |
- 解释:tablesample(bucket x out of y on id)
- y表示抽取多少个桶数据,y必须为桶的倍数或者因子
- x表示从哪个桶开始抽取数据,如果有多个分区,以后的分区号 = 当前分区号+y
- x<=y必须成立,否则报错
其他常用函数
空字段赋值nvl
1 | select class, nvl(class,-1) from students_buks; |
如果表中的class字段为null,用-1代替
行转列
将多列数据转换为行,类比聚合函数
CONCAT(string A/col,string B/col,…)
:返回字符串拼接后的结果;- concat(‘a’,’b’,’c’) —- ‘abc’
- concat(‘’a,null,’c’)—-null
CONCAT_WS(separatot,str,str,…)
:使用分隔符连接;- concat_ws(‘/‘,’2018’, ‘12’, ‘19’)—-2018/12/19
- concat_ws(‘:’,’22’,’47’,null)—-22:47
- concat_ws(null,’22’,’47’)—-null
COLLECT_SET(col)
:函数只接受基本数据类型,将某个字段的值进行去重汇总,产生array类型字段;- 分组后,将该组的col行聚合成为一个array
COLLECT_LIST(col)
:同上,但是不去重。
列转行
假设现在有表table1
:
col1 | col2_list |
---|---|
“x” | [1, 2, 3] |
“y” | [3, 4, 5] |
要处理为table2
:
col1 | col2 |
---|---|
“x” | 1 |
“x” | 2 |
“x” | 3 |
“y” | 3 |
“y” | 4 |
“y” | 5 |
lateral view
1 | SELECT |
explode
功能:可以将一个array或者map展开
- explode(array):
将array列表里的每个元素生成一行
- explode(map):
每一对元素作为一行,key为一列,value为一列
Hive中的数据类型
基本数据类型
数值型:
TINYINT
:微整型,只占用1个字节,只能存储0-255的整数。SMALLINT
:小整型,占用2个字节,存储范围–32768 到 32767。INT
:整型,占用4个字节,存储范围-2147483648到2147483647。BIGINT
:长整型,占用8个字节,存储范围-2^63到2^63-1。
布尔型
BOOLEAN
:TRUE/FALSE
浮点型
FLOAT
:单精度浮点数。DOUBLE
:双精度浮点数。
字符串型
STRING
:不设定长度。
日期类型
timestamp
:时间戳date
:日期
复杂数据类型:
Structs
,Maps
,Arrays