HIVE User Guide 总结之四HIVE 的MAP/REDUCE、注意点
7.HIVE 的MAP/REDUCE
7.1 jion
对于 JOIN 操作:
INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);
实现过程为:
Map:
以 JOIN ON 条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合
以 JOIN 之后所关心的列作为 Value,当有多个列时,Value 是这些列的组合。在 Value 中还会包含表的 Tag 信息,用于标明此 Value 对应于哪个表。
按照 Key 进行排序。
Shuffle:
根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中。
Reduce:
Reducer 根据 Key 值进行 Join 操作,并且通过 Tag 来识别不同的表中的数据。
具体实现过程如图:
7.2 GROUP BY
SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;
7.3 DISTINCT
SELECT age, count(distinct pageid) FROM pv_users GROUP BY age;
实现过程如图:
8.使用HIVE注意点
8.1字符集
Hadoop和Hive都是用UTF-8编码的,所以, 所有中文必须是UTF-8编码, 才能正常使用。
备注:中文数据load到表里面, 如果字符集不同,很有可能全是乱码需要做转码的, 但是hive本身没有函数来做这个
8.2 压缩
hive.exec.compress.output 这个参数, 默认是 false,但是很多时候貌似要单独显式设置一遍,否则会对结果做压缩的,如果你的这个文件后面还要在hadoop下直接操作, 那么就不能压缩了
8.3 count(distinct)
当前的 Hive 不支持在一条查询语句中有多 Distinct。如果要在 Hive 查询语句中实现多Distinct,需要使用至少 n+1 条查询语句(n为distinct的数目),前 n 条查询分 别对 n 个列去重,最后一条查询语句对 n 个去重之后的列做 Join 操作,得到最终结果。
8.4 Join
只支持等值连接
8.5 DML操作
只支持INSERT/LOAD操作,无UPDATE和DELTE
8.6 HAVING
不支持HAVING操作。如果需要这个功能要嵌套一个子查询用where限制
8.7 子查询
Hive不支持where子句中的子查询
8.8 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;
实践中,这一语义区别也是经常导致数据倾斜的原因之一。
8.9 分号字符
分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:
select concat(cookie_id,concat(';',’zoo’)) from c02_clickstat_fatdt1 limit 2;FAILED: Parse Error: line 0:-1 cannot recognize input '<EOF>' 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码来转义。
8.10 Insert
1. 新增数据
根据语法Insert必须加“OVERWRITE”关键字,也就是说每一次插入都是一次重写。那如何实现表中新增数据呢?
假设Hive中有表xiaojun1,
hive> DESCRIBE xiaojun1;
OK
id int
value int
hive> SELECT * FROM xiaojun1;
OK
3 4
1 2
2 3
现增加一条记录:
hive> INSERT OVERWRITE TABLE xiaojun1
SELECT id, value FROM (SELECT id, value FROM xiaojun1 UNION ALL SELECT 4 AS id, 5 AS value FROM xiaojun1 limit 1
) u;
结果是:
hive>SELECT * FROM p1;
OK
3 4
4 5
2 3
1 2
其中的关键在于, 关键字UNION ALL的应用, 即将原有数据集和新增数据集进行结合, 然后重写表
2.插入次序
INSERT OVERWRITE TABLE在插入数据时,是按照后面的SELECT语句中的字段顺序插入的. 也就说, 当id 和value 的位置互换, 那么value将被写入id, 同id被写入value.
3. 初始值
INSERT OVERWRITE TABLE在插入数据时, 后面的字段的初始值应注意与表定义中的一致性. 例如, 当为一个STRING类型字段初始为NULL时:
NULL AS field_name // 这可能会被提示定义类型为STRING, 但这里是void
CAST(NULL AS STRING) AS field_name // 这样是正确的
又如, 为一个BIGINT类型的字段初始为0时:
CAST(0 AS BIGINT) AS field_name
jiewei
转载于:https://my.oschina.net/MrMichael/blog/307304
HIVE User Guide 总结之四HIVE 的MAP/REDUCE、注意点相关推荐
- hive linux进程数,控制Hive MAP个数详解
控制Hive MAP个数详解 Hive的MAP数或者说MAPREDUCE的MAP数是由谁来决定的呢?inputsplit size,那么对于每一个inputsplit size是如何计算出来的,这是做 ...
- Hive总结(六)hive入门经典
转自:http://www.zypx.cn/technology/20100606132430320046.html Hive 是什么 在接触一个新的事物首先要回到的问题是:这是什么? 这里引用 Hi ...
- 2021年大数据Hive(十一):Hive调优
全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive调优 一.本地模式 1.空key处理 二.SQL ...
- 2021年大数据Hive(九):Hive的数据压缩
全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive的数据压缩 一.MR支持的压缩编码 二.压缩配置 ...
- Hive 高级编程??深入浅出学Hive
目录: 初始Hive Hive安装与配置 Hive 内建操作符与函数开发 Hive JDBC hive参数 Hive 高级编程 Hive QL Hive Shell 基本操作 hive 优化 Hive ...
- 大数据_MapperReduce_与hive的集成_使用hive数据分析工具_关联操作hbase---Hbase工作笔记0025
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们我们再来看一下hbase和hive的集成.如果hive和hbase结合了以后, 我们就可以 ...
- [Hive]那些年我们踩过的Hive坑
1. 缺少MySQL驱动包 1.1 问题描述 Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFound ...
- 打怪升级之小白的大数据之旅(六十七)<Hive旅程第八站:Hive的函数>
打怪升级之小白的大数据之旅(六十七) Hive旅程第八站:Hive的函数 上次回顾 上一章,我们学习了如何对数据进行拆分–分区表与分桶表,使用分区表与分桶表,可以加快我们的查询效率..本章节是Hive ...
- 认识Hive,以及Hive的数据定义与数据操作,hive的数据查询和hive函数
认识Hive 为什么要出现hive 前面知识我们讲到mapreudce计算框架,各位需要通过java编码的形式来实现设计运算过程,这对各位的编程能力提出了更高的要求,难道没有门槛更低的方式来实现运算的 ...
最新文章
- [转]关于安卓与ios的推送系统,我说说自己的看法。
- 怎么在云服务器上建网站_云服务器怎么做安全维护
- PyTorch 1.0 中文官方教程:使用PyTorch进行深度学习
- gcc 编译流程分析
- 阿里题目:明星群众问题
- 【协作通信】基于matlab协作通信仿真【含Matlab源码 1006期】
- ubuntu磁盘分区与挂载
- HashMap初始容量指定规则
- java多态的三种表现形式
- HiveSQL分位数函数percentile()使用详解+实例代码
- 苹果cms怎么更换模板教程
- 华为Mate20系列赢得各界盛誉,棋圣聂卫平也对其AI性能称赞
- javascript跳转页面
- 【高项】一次过 信息系统项目管理师 心得
- CSS3 matrix矩阵
- 精致好看的真无线耳机,音质也不错,JEET ONE升级版上手
- 一阶数字低通滤波器的实现
- 第六章 第二节 selenium+unittest测试框架之批量执行测试用例
- 软件外包平台有哪些?
- 关于阿里云服务器迁移的记录
热门文章
- win10服务器文件夹显示不全,win7、win10部分软件窗口显示不完整解决办法
- 商业银行经营全解析之FTP(内部资金转移定价)
- 【10】python 读写word文档
- html中圆形单元格,HTML代码中关于table的边框控制以及单元格艰巨
- 输入一个秒数将其转换成天时分秒
- Jira项目管理配置指南(二)—— 工作流配置
- 钣金工艺流程可能各不相同,以下几点.
- nohup 命令的开启和关闭
- java strcat_strcat 函数的使用指南
- python按字母顺序排列_在Python中按字符串的字母顺序查找第n个排列