IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【Hive】一次被分区条件和笛卡尔积制裁的经历 -> 正文阅读

[大数据]【Hive】一次被分区条件和笛卡尔积制裁的经历

记录一下之前遇到的一个问题:一张几百T按天dt分区的订单表,要关联一张几M的订单类型快照表,逐月分析。

因为用的时候left join,所以订单表放在了左边,但是hive中如果要将两张表join起来的话,大表放在左边效率会比较低,如果所有表中只有一张表是小表,那么可以在最大的表通过mapper的时候将小表完全放到内存中。

Hive可以在map端执行连接过程,称为map-side JOIN,这是因为Hive可以和内存中内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的reduce过程。即使对于很小的数据集,这个优化也明显地要快于常规的连接操作,不仅减少了reduce过程,而且有时还可以同时减少map过程的执行步骤。

想要使用这个优化可以设置属性hive.auto.convert.JOIN的值为true:

-- 演示代码,无实际业务
set hive.auto.convert.join=true;

create table res_table as
select
	a.*,
	b.type
from (
	(select
		*
	from
		order_table
	where
		user_id is not null 
		and user_id <> ''
		and dt >= '2021-07-01'
		and dt <= '2021-07-31') as a
	left join (
		select
			*
		from
			order_type_table) as b
	on a.type_id = b.type_id;
)

但是不知道为啥,执行的效率还是很满,只要join表就的花个三个小时左右,我寻思也不应该啊,我每次只取了一个月的订单数据,已经加了优化,怎么可能还跑那么久。

于是没办法,只能去求助mentor,结构被一眼打回来了,a表的where筛选条件有问题,因为是dt分区表,所以应该先筛选dt,然后再判断user_id不为空。

使用dt分区表时where筛选条件中分区字段要放在前面

改完了之后,能跑是能跑了,而且几分钟就跑完了,map和reduce都到了100%,但是最后要把数据写到表里的时候却巨慢无比,又花了好几个小时。

结果我一看数据,我的天,不太对劲,本来a表只有几亿条记录,结果写入res_table之后一下变成十几亿条记录,这妥妥的是产生笛卡尔积了啊。

然后看了一篇文章:left join 与join都会形成笛卡尔积

确认了一下,确实是产生笛卡尔积了,但是type_id应该是唯一的啊,一问才知道,原来b表是快照表,限制最新分区,我没卡dt,所以才产生了笛卡尔积。

最后改完就好啦:

-- 演示代码,无实际业务
set hive.auto.convert.join=true;

create table res_table as
select
	a.*,
	b.type
from (
	(select
		*
	from
		order_table
	where
		dt >= '2021-07-01'
		and dt <= '2021-07-31' 
		and user_id <> ''
		and user_id is not null) as a
	left join (
		select
			*
		from
			order_type_table
		where
			dt = '2021-07-01') as b
	on a.type_id = b.type_id;
)
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:09:17  更:2021-08-07 12:11:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 16:43:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码