第六章

1:什么情况下hive可以避免进行MapReduce?

Hive是一个SQL语句的解析引擎,其本质是将hql查询转化为MapReduce任务。但是在某些情况下是不必转化为MapReduce任务的,也就是所谓的本地模式。
Eg:
1:select from employee;这种是比较简单的查询,不会转为MapReduce任务的。
2:where语句中只是分区字段这种条件也是无需mapreduce过程。
Select
from employee
Where country=’US’ AND state=’CA’
LIMIT 100;
3:设置属性
set hive.exec.mode.local.auto=true;
设置为true hive会尝试使用本地模式执行其他操作;

2 hive不能在where语句中使用列别名

3 sql使用=,而不是==

4:关于浮点数的比较

这个是比较重要的一个知识点,在SQL语句中或者是在其他的浮点数比较中,都会出现的一个点:就是float的数据类型在和double类型比较时,会发生一个隐式的类型转换,hive中会将float的数值类型隐式的装换了double类型,让后在进行比较,但是这样的比较在实际开发中是会出问题的,会丢失精度,比如:
Float a =0.2, double b=0.2
此时在hive中比较的话会发生什么现象呢?
结果是 a>b
这是为什么?
因为0.2对于float类型是0.2000001,而对于double类型的0.200000000001。这也是因为一个8字节的DOUBLE值具有更多的小数位。所在在发生隐式装换时Float的值通过hive装换为DOUBLE值时,产生的double值为0.2000001000000,这个值要比0.200000000001要大,所以在hive中比较会不一样的原因。
由此推而广之,这个问题不单单是存在在hive和java中,只要是有IEEE标准进行浮点数编码的系统中普遍存在的问题。
但是对于以上问题hive也会是有解决之道的:
1:在hive中读取数据的时候可以在表模式设计的时候将其数据格式定义为double类型。
2:这个规避方案就是显式的之处0.2位FLOAT,java中有一个很好的方式就是数值末尾加上F或f,可惜就是hive不支持这种方式,必须要用cast();cast(value as FLOAT)

5 hive中的like和relike

Like,和正常的SQL语句一样就是做一些模式匹配
Relike 这个是hive中的扩展功能,可以通过Java的正则表达式这个强大的语言来指定匹配条件。Relike中
. 表示任意字符串匹配
* 表示重复
x|y 表示和x或y匹配