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、注意点相关推荐

  1. hive linux进程数,控制Hive MAP个数详解

    控制Hive MAP个数详解 Hive的MAP数或者说MAPREDUCE的MAP数是由谁来决定的呢?inputsplit size,那么对于每一个inputsplit size是如何计算出来的,这是做 ...

  2. Hive总结(六)hive入门经典

    转自:http://www.zypx.cn/technology/20100606132430320046.html Hive 是什么 在接触一个新的事物首先要回到的问题是:这是什么? 这里引用 Hi ...

  3. 2021年大数据Hive(十一):Hive调优

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive调优 一.本地模式 1.空key处理 二.SQL ...

  4. 2021年大数据Hive(九):Hive的数据压缩

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive的数据压缩 一.MR支持的压缩编码 二.压缩配置 ...

  5. Hive 高级编程??深入浅出学Hive

    目录: 初始Hive Hive安装与配置 Hive 内建操作符与函数开发 Hive JDBC hive参数 Hive 高级编程 Hive QL Hive Shell 基本操作 hive 优化 Hive ...

  6. 大数据_MapperReduce_与hive的集成_使用hive数据分析工具_关联操作hbase---Hbase工作笔记0025

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们我们再来看一下hbase和hive的集成.如果hive和hbase结合了以后, 我们就可以 ...

  7. [Hive]那些年我们踩过的Hive坑

    1. 缺少MySQL驱动包 1.1 问题描述 Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFound ...

  8. 打怪升级之小白的大数据之旅(六十七)<Hive旅程第八站:Hive的函数>

    打怪升级之小白的大数据之旅(六十七) Hive旅程第八站:Hive的函数 上次回顾 上一章,我们学习了如何对数据进行拆分–分区表与分桶表,使用分区表与分桶表,可以加快我们的查询效率..本章节是Hive ...

  9. 认识Hive,以及Hive的数据定义与数据操作,hive的数据查询和hive函数

    认识Hive 为什么要出现hive 前面知识我们讲到mapreudce计算框架,各位需要通过java编码的形式来实现设计运算过程,这对各位的编程能力提出了更高的要求,难道没有门槛更低的方式来实现运算的 ...

最新文章

  1. [转]关于安卓与ios的推送系统,我说说自己的看法。
  2. 怎么在云服务器上建网站_云服务器怎么做安全维护
  3. PyTorch 1.0 中文官方教程:使用PyTorch进行深度学习
  4. gcc 编译流程分析
  5. 阿里题目:明星群众问题
  6. 【协作通信】基于matlab协作通信仿真【含Matlab源码 1006期】
  7. ubuntu磁盘分区与挂载
  8. HashMap初始容量指定规则
  9. java多态的三种表现形式
  10. HiveSQL分位数函数percentile()使用详解+实例代码
  11. 苹果cms怎么更换模板教程
  12. 华为Mate20系列赢得各界盛誉,棋圣聂卫平也对其AI性能称赞
  13. javascript跳转页面
  14. 【高项】一次过 信息系统项目管理师 心得
  15. CSS3 matrix矩阵
  16. 精致好看的真无线耳机,音质也不错,JEET ONE升级版上手
  17. 一阶数字低通滤波器的实现
  18. 第六章 第二节 selenium+unittest测试框架之批量执行测试用例
  19. 软件外包平台有哪些?
  20. 关于阿里云服务器迁移的记录

热门文章

  1. win10服务器文件夹显示不全,win7、win10部分软件窗口显示不完整解决办法
  2. 商业银行经营全解析之FTP(内部资金转移定价)
  3. 【10】python 读写word文档
  4. html中圆形单元格,HTML代码中关于table的边框控制以及单元格艰巨
  5. 输入一个秒数将其转换成天时分秒
  6. Jira项目管理配置指南(二)—— 工作流配置
  7. 钣金工艺流程可能各不相同,以下几点.
  8. nohup 命令的开启和关闭
  9. java strcat_strcat 函数的使用指南
  10. python按字母顺序排列_在Python中按字符串的字母顺序查找第n个排列