文章目录
1.select…from语句
1.从map,struct,array中取数据
map -> select map['key'] from `tbl_name`
struct -> select struct.key from `tbl_name`
array -> select array[index] from `tbl_name`
2.使用正则表达式来指定列的值
select `price.*` from `tbl_name` 选取所有以price的列
3.可以对列值进行函数调用与算术表达式计算
select upper(name) ,age + 3 form `tbl_name`
3.1算术表达式类型
符号 | 作用 |
---|---|
* | 乘 |
/ | 除 |
+ | 加 |
- | 减 |
| | 或 |
& | 按位与 |
~ | 按位取反 |
^ | 异或 |
4.limit语句
限制查询返回的行数
select * from `tbl_name` limit 1; 只返回一行
5.case…when…then
select
case
when age < 10 then '儿童'
when age < 18 then '少年'
else '成年人'
end
from `tbl_name`; 类似于if...else if....else....
6.什么情况下hive不会进行mapreduce
在执行一些不需要mapreduce操作的时候,hive可能会在本地模式下运行。
比如 select * fromtbl_name
hive只需要输出格式化的文件即可
把hive.exec.mode.local.auto = true
hive会优先考虑使用本地模式,节省软硬资源。
2. where语句
select语句用于选择列,where语句用于过滤条件。
where 语句后不可以出现列别名
1逻辑运算符
操作符 | 支持的数据类型 | 描述 |
---|---|---|
A = B | 基本数据类型 | A = B返回true,A B都为NULL时返回NULL |
A <=> B | 基本数据类型 | A B都为NULL时返回true,其他和 = 一样 |
A <> B,A !=B | 基本数据类型 | A 或B为NULL时 返回NULL |
A [not] between B and C | 基本数据类型 | A,B,C一方为NULL时返回NULL |
A is NULL | 所有数据类型 | A 为 NULL时返回true |
A [not] like B | string 类型 | 正则匹配 |
2关于浮点数的比较
select * from `tbl_name` where num > 0.2
假设num 在模式定义中为float类型, 那么这条语句,会把num = 0.2的记录也输出。这是为什么呢?
0.2默认的存储方式是double。所以num与0.2进行比较时,要隐式的从float转换成double,由于浮点数在计算机内存IEEE标准存储的.所以float 0.2只是看起来和0.2是一样的,但是实际上还是有一些精度损失的。
解决方案
1.将num的模式变为double
2.将 0.2 转换为float : cast (0.2 as float)
3.使用decimal数据类型表示定点数
3.like和RLike
** like和Rlike的区别是 Rlike可以使用java中正则表达式的规则。**
3.group by 语句
分组语句通常和聚合语句一起使用
hiving 语句
对分组后的记录进行条件过滤
4. Join语句
Hive中只支持等值连接
1.内连接(inner join)
只有进行连接的两个表中都存在与连接标准相匹配的数据是才会被保留下来。
2.左外连接(left out join)
左表中符合连接标准的记录会被保存下来
3.右外连接(right out join)
左表中符合连接标准的记录会被保存下来
4.全外连接(full out join)
返回所有表中符合记录的语句。是左连接和右连接的并集
5.左半开连接(left semi join)
返回左表中的记录,且该记录符合on的条件。此时select和where中不能出现右表的字段名称。
6.笛卡尔积(join)
相当于双重for循环
map side join
如果所有表只有一张表是小表,可以在mapper时将小表缓存到内存中,达到优化的效果
从hive v0.7版本开始,hive就废弃了这种标记方式,但是依旧是有用的。如果不加上这个标记,那么用户需要设置hive.auto.convert.join = true
,hive在必要时启动这个优化。
// 开启优化
set hive.auto.convert.join = true
// 可以被map join 优化的最大表的文件大小
set hive.mapjoin.smalltable.filesize = MAXSIZE
d是小表
select /* MAPJOIN(d)*/ ... from stock s join dividends d on...
4.JOIN优化
1.进行多表连接时,假如连接的键是相同的话,那么hive将会进行优化,只启动一个MR。
2.在进行连接时,表的规模应该是从左到右依次递增
。
3.map-side JOIN。
5 order by 和 sort by
- order by: 对数据进行全局排序
- sort by: 对每个reduce的结果进行排序(达到局部有序的效果)
6 含有sort by 的distrubute by
7 cluster by
8 类型转化
强制类型转换函数 cast(value as TYPE), 类型不符合时 hive会返回NULL。
9.抽样查询
10. union all
union all 可以将两个和多个表进行合并,但是每一张表中对应的列应该完全相同。
union 去重求并集 。
union all 求全部的并集。