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中不会出现这种问题

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握 Go 语言中的循环结构:从基础到高级

一、if else(分支结构) 1、if 条件判断基本写法 package main import ("fmt" ) func main() {score : 65if score > 90 {fmt.Println("A")} else if score > 75 {fmt.Println("B")} else {fmt.Println("C")} } 2、if 条件判断…

内网环境安装K8S1.20.11版本集群

目录 第一章.实验要求和环境 1.1.实验要求 1.2.实验环境 1.3.依赖关系处理 第二章.K8S的安装过程 2.1.初始化到集群安装成功 ------------------------------ 环境准备 ------------------------------ docker安装好了后 2.2.安装K8组件 -------------------- 部署K8…

1-Hadoop原理与技术

单选题 题目1:安装Hadoop集群时,是在哪个文件指定哪些机器作为集群的从机? 选项: A datanode B slaves C yarn-site.xml D core-site.xml 答案:B ------------------------------ 题目2:Hadoop配置文件所在目录是哪…

计算机基础知识64

ForeignKey属性 to:设置要关联的表 related_name: 反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’ related_query_name:反向查询操作时,使用的连接前缀,用于替换表名 to_field:设置要关联的表…

最长连续序列(leetcode 128)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一:排序方法二:哈希表 5.实现示例参考文献 1.问题描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你…

【华为OD题库-049】评论转换输出-java

题目 在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。评论具有树状结构,除了根评论外,每个评论都有一个父评论。 当评论保存时,使用以下格式: 首先是评论的内容; 然后是回复当前评论的数量。 最后是当…

如何保持操纵机构丝杆的精度?

滚珠丝杆是操纵机构中的重要组成部分,可以传递较高的扭矩,并且具有低摩擦、高效率和快速响应的特性,这使得操纵机构能够实现高速、高精度的运动控制,这对于整个系统的性能和精度具有决定性的影响,保持操纵机构丝杆的精…

互联网Java工程师面试题·Spring Boot篇·第二弹

目录 8、什么是 YAML? 9、如何实现 Spring Boot 应用程序的安全性? 10、如何集成 Spring Boot 和 ActiveMQ? 11、如何使用 Spring Boot 实现分页和排序? 12、什么是 Swagger?你用 Spring Boot 实现了它吗? …

YoloV5改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…

MATLAB 系统辨识 - 在线估计 - Online Estimation

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control MATLAB 自抗扰控制 - Active Disturbance Rejection Control 文章目录 系列文章目录前言一、在线参数估计二、使用步骤 前言 在线估计(Online estimation)算法是在物理系…

C语言枚举

枚举的定义 定义: C语言提供了一种枚举(enum)类型,能够列出所有可能的取值,并给它们取一个单独的名称使用该类型可以定义枚举类型的变量,一个枚举类型变量可以包含一组相关的标识符,其中每个标…

【wvp】测试记录

ffmpeg 这是个莫名其妙的报错,通过排查,应该是zlm哪个进程引起的 会议室的性能 网络IO也就20M

全志T527设置gpio口输出高电平实际输出低电平

前言 在调试T527的时候,主板另外添加了gpio口去控制usb口的电源开关,软件上面需要在内核运行的时候将gpio口设置输出高电平,usb口才可以正常使用。改好系统固件后,升级发现,机器开机动画过程中可以控制gpio口去打开us…

ArkUI组件--Button组件

1.声明Button组件 Button(label?:ResourceStr) #label是按钮上显示的文本 ①label是文字类型 所写文字会在按钮上显示 ②不输入label内容,需要额外定义一些描述。例如插入图片(需要定义图片属性) Button(){Image($r(app.media.xxx)).wi…

解决Flutter报错boxconstraints has non-normalized height/width constraints

出错场景 如果我们在使用约束时没有正确的传入宽高,比如以下代码 ConstrainedBox(/// 设置最小高度为150, 最大高度为100.constraints: BoxConstraints(minHeight: 150,maxHeight: 100),child: Container(color: Colors.red,child: Center(child: Text(呵呵),),),…

54.螺旋矩阵(顺时针打印矩形元素)

题目 class Solution {public List<Integer> spiralOrder(int[][] matrix) {int m matrix.length, n matrix[0].length;int leftUpM 0, leftUpN 0, rightDownM m - 1, rightDownN n - 1;List<Integer> res new ArrayList<>();while (leftUpM < ri…

【题目】栈和队列专题

文章目录 专题一&#xff1a;栈系列1. 中缀表达式转后缀表达式&#xff08;逆波兰式&#xff09;2. 有效的括号3. 用栈实现队列4. 最小栈 专题一&#xff1a;栈系列 1. 中缀表达式转后缀表达式&#xff08;逆波兰式&#xff09; 算法原理 2. 有效的括号 题目链接 算法原理 代…

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别&#xff0c;有时候需要查看 WARN 级别的日志&#xff0c;所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

C++面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…

Java架构师技术架构路线

目录 1 概论2 如何规划短中长期的技术架构路线图3 如何规划面向未来的架构4 如何修订路线图执行过程中的偏差5 如何落地路线图-阿里系糙快猛之下的敏捷模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 概论 首先,规划一个短中长期的技术路线图是非常重要的。短中…