Hive数据倾斜之:数据类型不一致导致的笛卡尔积

Hive数据倾斜之:数据类型不一致导致的笛卡尔积

目录

      • Hive数据倾斜之:数据类型不一致导致的笛卡尔积
        • 一、问题描述
        • 二、原因分析
        • 三、精度损失
        • 四、问题解决

一、问题描述

如果两张表的jion,关联键分布较均匀,没有明显的热点问题,在执行的过程中出现了数据倾斜的情况,是什么原因

二、原因分析

数据倾斜通常会出现在关联操作或者聚合操作相关的位置,所以出现数据倾斜后,可以先排查一下是否出现了某个key的数量过多,对于上述的问题,排查之后发现并没有明显的热点key的问题。接下里就考虑是不是数据本身分布的原因,想想也不合理,最后查看了数据,发现关联键的长度很长,有19位,就开始怀疑是不是两张表的关联键类型不一致,导致了隐式转换,查询了数据类型,果真不一样,一个是bigint类型,一个是string类型

那么为什么类型不一致会出现隐式转换呢,把执行的sql的单独拿出来看下执行计划,发现了如下的一段神奇东东

在这里插入图片描述

在hive2.7中,当类型不一致时,会自动将关联键转换为double类型,而double类型对于过大值的存储是有精度存储的

所以问题定位了,因为存在精度损失,所以那么多的key虽然不一样,但是被当作了一样,然后被无情的join在了一起,如果有2个key,就join4次,4个key,就join16次,那可不就倾斜了吗。

三、精度损失

所谓精度损失,就是在表示过大数值的时候会存在一定的误差。而double类型能准确的表示15-17位的数值,超过则会存在精度损失。

之所以double能精确表示15-17位数据,因为double类型是使用64位(8字节)来表示的。这意味着double类型的精度有53位。其中,52位用于表示有效数字(尾数),1位用于表示符号位。另外,double类型还有11位用于表示指数部分。由于双精度浮点数采用了IEEE 754标准,它可以表示非常大或非常小的数值,并且具有相对较高的精度。然而,由于浮点数的特性,它们可能会存在舍入误差和精度损失的问题。

比如:数值:171555543206125977 和 171555543206125979,在hive中就是想等的

输入:
select cast(171555543206125977 as double) = cast(171555543206125979 as double)

输出:
true

在双精度浮点数(double)中,无法精确地存储整数值1715555432061259777。由于双精度浮点数使用64位(8字节)来表示,其中一部分用于表示有效数字(尾数),一部分用于表示指数部分,还有一位用于表示符号位。

双精度浮点数的尾数部分有52位,可以精确地表示15到17位的十进制数值。而整数值1715555432061259777有19位,超过了双精度浮点数的精度范围。

当我们尝试将整数值1715555432061259777存储为双精度浮点数时,可能会出现舍入误差或精度损失。双精度浮点数会尽可能地接近给定的数值,但无法保证完全精确。

四、问题解决

解铃还需系铃人,既然是因为类型不一致导致的隐式转换从而导致的精度存储,那么就避免类型不一致的问题,在使用关联时候要确保关联键的类型一致,或者切换Spark引擎,因为Spark中不会出现这种问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/211170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无桌面版docker在Ubuntu系统上安装

目录 注意 系统要求 卸载旧版本 安装 使用apt存储库安装 1. 设置 Docker 的apt存储库。 2. 安装Docker软件包 3. 通过运行镜像来验证Docker Engine安装是否成功 hello-world。 从包中安装 1. 进入 https://download.docker.com/linux/ubuntu/dists/。 2. 在列表中选择…

阿里云MySQL从 2003->1251->1396

目的 由于需要在阿里云的实例中装MySQL数据库,安装前期(本地访问)还是挺顺利的,但是到了远程连接的时候,却出现了一系列的Bug,以为是没有 实名认证没有备案 的原因导致的,但是后来…

在Spring Boot中使用@Async实现一个异步调用

在使用异步注解之前,我们需要先了解,什么是异步调用? 异步调用对应的事同步调用,同步调用是值程序按照我们定义的顺序依次执行,每一行程序都必须等待上一行的程序执行完成之后才执行,而异步是指在顺序执行…

动态规划------方法汇总

核心: 状态定义 状态转移方程 启发思路(两种情况):选 或 不选 / 选哪个 DP三步:先写回溯,时间复杂度 指数级别;递归的过程中会重复计算,要保存计算结果,递归搜索…

uniapp是否可以用elementUI等前端UI库、使用步骤以及需要注意的问题

文章目录 uniapp是否可以用elementUI等前端UI库使用方法和步骤问题如何解决 uniapp是否可以用elementUI等前端UI库 在PC端开发uniapp,可以用elementUI,因为elementUI就是PC端的。 在使用uniapp,选择vue2.0时,实测可以用nodejs16的…

Linux部署HDFS集群

(一)VMware虚拟机中部署 ps、其中node1、node2、node3替换为自己相应节点的IP地址,或者host文件中配置过的主机名,或者看前置准备 或者查看前置准备:Linux部署HDFS集群前置准备 1.下载压缩包 https://www.apache.or…

管理类联考-性质

性质 ——性质—— 一、是什么 (1)本质:判断一定范围内的对象是否具备某个性质的命题就是性质命题(直言命题)。直言命题是断定事物/对象是否具有某种性质的命题。直言命题在结构上由主项、谓项、联项和量项组成。 &am…

对Spring框架的一些总结

对Spring框架的一些总结 在文章开头我真心推荐大家一个优秀的编程老师:孙帅老师(孙哥suns),孙帅老师在哔哩哔哩的Spring5教学视频时长接近33个小时,从0基础到一步一步手把手的教你抽丝剥茧分析Spring框架的所有知识,孙帅老师的教…

打印元素绘制协议Java实现

我一直提倡的面向接口和约定编程,而打印元素绘制协议一直是我推荐的打印实现方式,我以前只是强调按打印元素绘制协议输出数据就行了,有实现程序按协议控制打印,说是可以用任何语言实现客户端程序而不影响打印业务,那么…

《opencv实用探索·八》图像模糊之均值滤波简单理解

1、前言 什么是噪声? 该像素与周围像素的差别非常大,导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息,降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素&am…

【动态规划】LeetCode-91.解码方法

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…

leetcode-160-相交链表(C语言实现)

题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,…

Leetcode226. 翻转二叉树

文章目录 题目介绍题目分析解题思路边界条件:节点为空时返回空子问题:交换左右子节点 整体代码 题目介绍 题目分析 题目要求我们将树中每个节点的左右子节点全部交换,最后返回交换后的树的根节点。 解题思路 这题是比较常见的递归,直接找边…

LangChain 18 LangSmith监控评估Agent并创建对应的数据库

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

最多不一定最好,只有适合的才是最好的!电脑的内存多大才是合理的

RAM,或称随机存取存储器,是最好的笔记本电脑和最好的电脑最重要的组成部分之一。硬盘驱动器(HDD)或固态驱动器(SSD)存储可以被视为电脑的长期内存,内存是其短期内存。内存可以跟踪后台运行的应用…

背包9讲系列2-完全背包问题

一、前言 又到周末了,这几天可以腾出时间来把背包系列的其他内容好好肝一肝,本次介绍的是完全背包问题,之前的系列内容请查看: 背包9讲系列1-01背包问题 二、完全背包 2.1 问题描述 有n个物品和一个容量为capacity的背包&…

误用STM32串口发送标志位 “USART_FLAG_TXE” “USART_FLAG_TC”造成的BUG

当你使用串口发送数据时是否出现过这样的情况: 1.发送时第一个字节丢失。 2.发送时出现莫名的字节丢失。 3.各种情况字节丢失。 1.先了解一下串口发送的流程图(手动描绘): 可以假想USART_FLAG_TXE是用于检测"弹仓"&…

C++11——initializer_list

initializer_list的简介 initializer_list是C11新出的一个类型,正如类型的简介所说,initializer_list一般用于作为构造函数的参数,来让我们更方便赋值 但是光看这些,我们还是不知道initializer_list到底是个什么类型,…

关于标准库中的vector - (涉及迭代器失效,深浅拷贝,构造函数,内置类型构造函数,匿名对象)

目录 关于vector vector中的常见接口 vector常见接口的实现 迭代器失效 关于深浅拷贝 关于vector 关于vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元…

零售数字化“逆熵”的6项原则和8种能力建设|ShopeX徐礼昭

作者:徐礼昭 来源:《三体零售逆熵法则》节选 旧的规则与秩序被打破,无序成为常态 新时代洪流裹挟冲击着传统零售 无序带来的“熵增”侵蚀企业生命 所有人都在不确定性中寻找确定 数字化如何助力企业铸就「反熵增」神器? 如何…