Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1209598
  • 博文数量: 259
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2518
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-13 16:12
个人简介

科技改变世界,技术改变人生。

文章分类

全部博文(259)

分类: HADOOP

2015-07-17 16:24:15

字符集
Hadoop和Hive都是用UTF-8编码的,所有中文必须是UTF-8编码, 才能正常使用
备注:中文数据load到表里面, 如果字符集不同,很有可能全是乱码需要做转码的, 但是hive本身没有函数来做这个
 
压缩
hive.exec.compress.output 这个参数, 默认是 false,但是很多时候貌似要单独显式设置一遍
否则会对结果做压缩的,如果你的这个文件后面还要在hadoop下直接操作, 那么就不能压缩了
 
count(distinct)
当前的 Hive 不支持在一条查询语句中有多 Distinct。如果要在 Hive 查询语句中实现多Distinct,需要使用至少 n+1 条查询语句(n为distinct的数目),前 n 条查询分别对 n 个列去重,最后一条查询语句对 n 个去重之后的列做 Join 操作,得到最终结果。

JOIN
只支持等值连接

DML操作
只支持INSERT/LOAD操作,无UPDATE和DELTE

HAVING
不支持HAVING操作。如果需要这个功能要嵌套一个子查询用where限制
子查询

Hive不支持where子句中的子查询
 
Join中处理null值的语义区别

SQL标准中,任何对null的操作(数值比较,字符串操作等)结果都为null。Hive对null值处理的逻辑和标准基本一致,除了Join时的特殊逻辑。

这里的特殊逻辑指的是,Hive的Join中,作为Join key的字段比较,null=null是有意义的,且返回值为true。检查以下查询:

select u.uid, count(u.uid)
from t_weblog l join t_user u on (l.uid = u.uid) group by u.uid;

查询中,t_weblog表中uid为空的记录将和t_user表中uid为空的记录做连接,即l.uid = u.uid=null成立。

如果需要与标准一致的语义,我们需要改写查询手动过滤null值的情况:

select u.uid, count(u.uid)
from t_weblog l join t_user u
on (l.uid = u.uid and l.uid is not null and u.uid is not null)
group by u.uid;

实践中,这一语义区别也是经常导致数据倾斜的原因之一。

分号字符

分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

select concat(cookie_id,concat(';','zoo')) from c02_clickstat_fatdt1 limit 2;

FAILED: Parse Error: line 0:-1 cannot recognize input '' in function specification

可以推断,Hive解析语句的时候,只要遇到分号就认为语句结束,而无论是否用引号包含起来。

解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

select concat(cookie_id,concat('\073','zoo')) from c02_clickstat_fatdt1 limit 2;

为什么是八进制ASCII码?

我尝试用十六进制的ASCII码,但Hive会将其视为字符串处理并未转义,好像仅支持八进制,原因不详。这个规则也适用于其他非SELECT语句,如CREATE TABLE中需要定义分隔符,那么对不可见字符做分隔符就需要用八进制的ASCII码来转义。
阅读(2496) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~