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

news2025/1/20 22:45:46

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.coloradmin.cn/o/1268967.html

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

相关文章

【Android Jetpack】Room数据库

文章目录 引入EntitiesPrimary Key主键索引和唯一性对象之间的关系外键获取关联的Entity对象嵌套对象Data Access Objects(DAOs)使用Query注解的方法简单的查询带参数查询返回列的子集可被观察的查询 数据库迁移用法 引入 原始的SQLite有以下两个缺点: …

uniapp2023年微信小程序头像+昵称分别获取

1、DOM <view class"m-user"><view class"user-info"><!--头像 GO--><button class"avatar avatar-wrapper" open-type"chooseAvatar" chooseavatar"onChooseAvatar"slot"right"><im…

GPU - cuda 安装

GPU - cuda 安装 环境搭建安装 0.确认你的电脑上有英伟达显卡 通过winR输入:control /name Microsoft.DeviceManager打开显示适配器&#xff0c;能看到显卡即可。我的版本是 3060 驱动版本 31.0.15.4617 1.查看主机显卡驱动版本. 主机GPU驱动版本决定你的主机最高能支持到什…

技术前沿丨Teranode如何实现无限扩容

​​发表时间&#xff1a;2023年9月15日 BSV区块链协会的技术团队目前正在努力开发Teranode&#xff0c;这是一款比特币节点软件&#xff0c;其最终目标是实现比特币的无限扩容。然而&#xff0c;正如BSV区块链协会网络基础设施负责人Jake Jones在2023年6月举行的伦敦区块链大会…

k8s中Pod控制器简介,ReplicaSet、Deployment、HPA三种处理无状态pod应用的控制器介绍

目录 一.Pod控制器简介 二.ReplicaSet&#xff08;简写rs&#xff09; 1.简介 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;rs较完整参数解释 2.创建和删除 &#xff08;1&#xff09;创建 &#xff08;2&#xff09;删除 3.扩容和缩容 &#xff08…

点击元素以外的事件监听

在项目中&#xff0c;我们经常会遇到需要监听目标元素以外的区域被点击或鼠标移入移出等需求。 例如下面我们有一个表格里面嵌套表单的组件 我希望点击n行的时候&#xff0c;n行的元素变成表单元素进行输入或者选择&#xff0c; 当我点击其他其他区域n行又会恢复成数据展示…

C语言二十一弹 --打印空心正方形

C语言实现打印空心正方形 思路&#xff1a;观察图中空心正方形&#xff0c;可知首行列和尾行列被黑色外框包裹&#xff0c;其它均为空。所以按观察打印即可。 总代码 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int main() {int n 0;while (scanf("%d&q…

2023年双十一报告(B站平台)

2023年双11购物节自10月24日开启预售&#xff0c;持续至11月13日落下帷幕。在购物狂欢期间&#xff0c;B站以更加成熟的姿态参战今年双11。 据B站官方数据显示&#xff0c;双11期间&#xff0c;B站带货GMV同比增长251%。其中视频带货GMV同比增长376%&#xff0c;直播带货GMV同…

Springboot 使用 阿里的 druid 连接池 启用 wall sql防火墙的情况下怎么支持多sql同时执行?

1、问题如上&#xff0c;看了不少网上的文章&#xff0c;在我这都不生效&#xff0c;网上主要的解决思路有两个。 第一个是&#xff1a;去掉配置文件中的 wall filter # 修改之前 spring.datasource.druid.filtersstat,wall,log4j# 修改之前 spring.datasource.druid.filte…

Python+requests+Jenkins接口自动化测试实例

在做功能测试的基础上&#xff0c;我平时也会用postman测试接口&#xff0c;不过postman只能测试一个一个接口&#xff0c;不能连贯起来&#xff0c;特别是我们公司的接口很多都是要用到token的&#xff0c;导致我每次测个需要登录的接口都要去获取到token&#xff0c;做了很多…

什么是主机安全,有什么作用?

当今数字化时代&#xff0c;网络安全威胁和风险日益突出&#xff0c;已成为企业面临的重大安全挑战。网络攻击者不断尝试利用各种技术和手段对企业网络资源进行探测和攻击&#xff0c;如&#xff1a;利用漏洞、木马、钓鱼、勒索等方式窃取数据、破坏系统、篡改信息。因此&#…

win10下安装 Anaconda + Cuda + Cudnn + Pycharm + Pytorch

1.安装Anaconda &#xff08;1-1&#xff09;下载Ananconda, Anaconda官网 选择windows版本&#xff1b; &#xff08;1-2&#xff09;安装Anaconda,一般选择【Just Me】 &#xff08;1-3&#xff09;建议不要装在C盘&#xff0c;后期多环境的python环境和各种库文件会占用很多…

Oracle 11g安装过程

文章目录 前言1.下载安装包2.安装2.1本地安装文件2.2 安装过程 3.查看是否安装成功3.1 查看oracle是否安装成功3.2 查看oracle服务 前言 本文仅用于记录亲自安装oracle的过程 1.下载安装包 官网地址&#xff1a; Oracle Database 11g Release 2 (11.2.0.1.0) 注意&#xff…

电脑开机提示“未正确启动”怎么办?

有时我们在打开电脑时&#xff0c;会出现蓝屏&#xff0c;并提示“电脑未正确启动”&#xff0c;那么&#xff0c;这该怎么办呢&#xff1f;下面我们就来了解一下。 方法一&#xff1a;执行系统还原 我们在上文中提到了Windows无法正确启动的问题可能是由于三方程序或者近期的…

web自动化之源selenium

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f324;️ 什么是自动化以为什…

从源码解析Containerd容器启动流程

从源码解析Containerd容器启动流程 本文从源码的角度分析containerd容器启动流程以及相关功能的实现。 本篇containerd版本为v1.7.9。 更多文章访问 https://www.cyisme.top 本文从ctr run命令出发&#xff0c;分析containerd的容器启动流程。 ctr命令 查看文件cmd/ctr/comman…

82401/06系列太赫兹倍频源模块

82401/06系列 太赫兹倍频源模块 分频段实现50GHz&#xff5e;500GHz信号 82401/06系列倍频源模块是在12413/12412和82401基础上推出的新一代信号发生器扩频产品&#xff0c;相对于上代产品在输出功率、使用便捷性等方面都有明显的改善。该系列倍频源模块可与信号发生器搭建成…

ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET

有个11g rac环境&#xff0c;停电维护后&#xff0c;orcl1正常启动了&#xff0c;orcl2启动报错如下 SQL*Plus: Release 11.2.0.4.0 Production on Wed Nov 29 14:04:21 2023 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SYS…

UI自动化测试的正确姿势 —— Airtest设备连接API详解第一篇

一、背景 Airtest作为一款优秀的自动化测试工具&#xff0c;有着强大的API功能&#xff0c;处理日常自动化测试过程中需要的各类操作。今天就给大家逐一介绍关于设备连接和常用API部分&#xff0c;结合自动化测试中的各类需求&#xff0c;看看如何通过使用Airtest来快速实现。…

leetCode 131.分割回文串 + 回溯算法 + 图解 + 笔记

131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串 示例 1&#xff1a; 输入&#xff1a;s "aa…