Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!

news2024/11/24 13:03:07

文章目录

      • 前言
      • dayofweek 函数官方说明
      • BUG 重现
      • Spark SQL 中的使用
      • 总结

前言

使用的集群环境为:

  • hive 3.1.2
  • spark 3.0.2

dayofweek 函数官方说明

dayofweek(date) - Returns the day of the week for date/timestamp (1 = Sunday, 2 = Monday, …, 7 = Saturday).

根据所给日期,返回该日期对应的周几数字,如:

周日 —— 1
周一 —— 2
周二 —— 3

周六 —— 7

BUG 重现

当前我有一张订单详情信息测试表,如下所示:

在这里插入图片描述
需求:获取某一个区间内周一至周日每天各个商品的售卖量,Hive SQL 代码如下:

select
    sku_id,
    sum(if(`dayofweek`(create_date)=2,sku_num,0)) Monday,
    sum(if(`dayofweek`(create_date)=3,sku_num,0)) Tuesday,
    sum(if(`dayofweek`(create_date)=4,sku_num,0)) Wednesday,
    sum(if(`dayofweek`(create_date)=5,sku_num,0)) Thursday,
    sum(if(`dayofweek`(create_date)=6,sku_num,0)) Friday,
    sum(if(`dayofweek`(create_date)=7,sku_num,0)) Saturday,
    sum(if(`dayofweek`(create_date)=1,sku_num,0)) Sunday
from
    order_detail
where
    create_date >= "2021-09-27"
    and
    create_date <= "2021-10-03"
group by
    sku_id;

该代码运行后,部分结果如下所示:

在这里插入图片描述
在我验证结果的时候,第一行就出现了错误,查看订单详情信息测试表发现,sku_id1 的商品在 2021-09-27(周一)这天售出了 2 件商品;

而在我们上面的代码运行结果中,发现 monday 周一统计的出售商品数量为 0,但是我们的 SQL 代码逻辑并没有出现问题啊。

在这里插入图片描述

反而像是该函数执行的结果,将整体向后平移了一个维度,saturday 的值是 sunday 的值,sunday 的值是 monday 的值…

那么为什么会出现这个问题呢?我就想到了可能是数据类型的问题,上面表结构中提到了,create_date 这个字段的类型是 string,而 dayofweek() 函数的参数是一个 date 类型的数据。

于是,我对数据类型进行了转换,然后便有了下面的结果:

select
    sku_id,
    sum(if(`dayofweek`(cast(create_date as date))=2,sku_num,0)) Monday,
    sum(if(`dayofweek`(cast(create_date  as date))=3,sku_num,0)) Tuesday,
    sum(if(`dayofweek`(cast(create_date  as date))=4,sku_num,0)) Wednesday,
    sum(if(`dayofweek`(cast(create_date  as date))=5,sku_num,0)) Thursday,
    sum(if(`dayofweek`(cast(create_date  as date))=6,sku_num,0)) Friday,
    sum(if(`dayofweek`(cast(create_date  as date))=7,sku_num,0)) Saturday,
    sum(if(`dayofweek`(cast(create_date  as date))=1,sku_num,0)) Sunday
from
    order_detail
where
    create_date >= "2021-09-27"
    and
    create_date <= "2021-10-03"
group by
    sku_id;

这次得到的结果就是正确的了。

在这里插入图片描述

但是令我不解的又来了,在我的印象中 dayofweek() 函数是可以直接传递一个 string 类型的数据啊。

如下所示:

在这里插入图片描述
2021-09-27 是周一,所以返回的结果是 2,显然这是正确的,那么为什么同样是 string 类型,这里是正常的,上面的代码中发生了异常。

然后我就想到,会不是是因为多个函数嵌套引发的 BUG,因为我们在最初的 SQL 中是这样写的:

    sum(if(`dayofweek`(create_date)=2,sku_num,0)) Monday,
    sum(if(`dayofweek`(create_date)=3,sku_num,0)) Tuesday,
    sum(if(`dayofweek`(create_date)=4,sku_num,0)) Wednesday,
    sum(if(`dayofweek`(create_date)=5,sku_num,0)) Thursday,
    sum(if(`dayofweek`(create_date)=6,sku_num,0)) Friday,
    sum(if(`dayofweek`(create_date)=7,sku_num,0)) Saturday,
    sum(if(`dayofweek`(create_date)=1,sku_num,0)) Sunday

嵌套了 sumif 以及 dayofweek 函数,于是,我不执行 sum 操作,并且不进行数据类型转换,看看周几判断结果是否正确,如下所示:

select
    sku_id,
    if(`dayofweek`(create_date)=2,sku_num,0) Monday,
    if(`dayofweek`(create_date)=3,sku_num,0) Tuesday,
    if(`dayofweek`(create_date)=4,sku_num,0) Wednesday,
    if(`dayofweek`(create_date)=5,sku_num,0) Thursday,
    if(`dayofweek`(create_date)=6,sku_num,0) Friday,
    if(`dayofweek`(create_date)=7,sku_num,0) Saturday,
    if(`dayofweek`(create_date)=1,sku_num,0) Sunday
from
    order_detail
where
    create_date >= "2021-09-27"
    and
    create_date <= "2021-10-03"

在这里插入图片描述

可以发现周几判断结果是对的。

但只要我加上 sum 聚合操作之后,就会发生异常,这种错误呢又可以通过转换数据类型进行规避,属于是闭环了家人们。

Spark SQL 中的使用

当我使用 Spark SQL 完成上面【BUG重现】中的需求时,发现【BUG重现】中最开始的 SQL 代码在这里是正常运行的,即使没有进行数据类型转换、而且使用了聚合函数的嵌套。

        spark.sql(
            """
              |select
              |    sku_id,
              |    sum(if(`dayofweek`(create_date)=2,sku_num,0)) Monday,
              |    sum(if(`dayofweek`(create_date)=3,sku_num,0)) Tuesday,
              |    sum(if(`dayofweek`(create_date)=4,sku_num,0)) Wednesday,
              |    sum(if(`dayofweek`(create_date)=5,sku_num,0)) Thursday,
              |    sum(if(`dayofweek`(create_date)=6,sku_num,0)) Friday,
              |    sum(if(`dayofweek`(create_date)=7,sku_num,0)) Saturday,
              |    sum(if(`dayofweek`(create_date)=1,sku_num,0)) Sunday
              |from
              |    order_detail
              |where
              |    create_date >= "2021-09-27"
              |    and
              |    create_date <= "2021-10-03"
              |group by
              |    sku_id
              |order by
              |    sku_id;
              |""".stripMargin).show()

在这里插入图片描述

最终的结果是正确的。

可以看出 Spark SQL 对其进行了优化,正经人平常谁用【Hive Cli / HiveServer2】啊!一天天整这破事。

我不是正经人…

总结

当我们的使用场景为【Hive Cli / HiveServer2】时:

在嵌套使用 dayofweek 函数的时候,将传递的参数转换为 date 类型,不要用 string 类型,从而避免引发该 BUG。

当我们的使用场景为【Spark SQL】时:

并不会出现该BUG。

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

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

相关文章

线性代数的本质笔记(3B1B课程)

文章目录 前言向量矩阵行列式线性方程非方阵点积叉积 前言 最近在复习线代&#xff0c;李永乐的基础课我刷了一下&#xff0c;感觉讲的不够透彻&#xff0c;和我当年学线代的感觉一样&#xff0c;就是不够形象。 比如&#xff0c;行列式为什么那么重要&#xff0c;它的含义究…

SQL 语句继续学习之记录二

三&#xff0c; 聚合与排序 对表进行聚合查询&#xff0c;即使用聚合函数对表中的列进行合计值或者平均值等合计操作。 通常&#xff0c;聚合函数会对null以外的对象进行合计。但是只有count 函数例外&#xff0c;使用count(*) 可以查出包含null在内的全部数据行数。 使用dis…

Ed腾讯云下一代CDN -- EdgeOne加速MinIO对象存储

省流 使用MinIO作为EdgeOne的源站。 背景介绍 项目中需要一个兼容S3协议的对象存储服务&#xff0c;腾讯云的COS虽然也兼容S3协议&#xff0c;但是也只是支持简单的上传下载&#xff0c;对于上传的时候同时打标签这种需求&#xff0c;就不兼容S3了。所以决定自建一个对象存储…

【分享】华为设备登录安全配置案例

微思网络www.xmws.cn&#xff0c;2002年成立&#xff0c;专业IT认证培训21年&#xff0c;面向全国招生&#xff01; 微 信 号 咨 询&#xff1a; xmws-IT 华为HCIA试听课程&#xff1a;超级实用&#xff0c;华为VRP系统文件详解【视频教学】华为VRP系统文件详解 华为HCIA试听课…

IDEA快速设置Services窗口

现在微服务下面会有很多SpringBoot服务&#xff0c;Services窗口方便我们管理各个SpringBoot服务&#xff0c;但有时IDEA打开项目后无法的看到Services窗口&#xff0c;以下步骤可以解决&#xff01;

shell脚本免交互

一.Here Document免交互 1.免交互概述 使用I/O重定向的方式将命令列表提供给交互式程序 是一种标准输入&#xff0c;只能接收正确的指令或命令 2.格式&#xff1a; 命令 <<标记 ....... 内容 #标记之间是传入内容 ....... 标记 注意事项 标记可以使用任意的合法…

无类别域间路由(Classless Inter-Domain Routing, CIDR):理解IP网络和子网划分(传统的IP地址类ABCDE:分类网络)

文章目录 无类别域间路由&#xff08;CIDR&#xff09;&#xff1a;理解IP网络和子网划分引言传统的IP地址类关于“IP地址的浪费” IP地址与CIDRIP地址概述网络号与主机号CIDR记法&#xff08;网络 网络地址/子网掩码&#xff09;网络和广播地址 CIDR的优势减少路由表项缓解IP…

【AUTOSAR标准规范的下载和阅读方法】

AUTOSAR标准规范的下载和阅读方法 文章目录 AUTOSAR标准规范的下载和阅读方法下载方法 下载方法 我们可以去AUTOSAR的官网进行AUTOSAR标准规范的下载&#xff1a; 官网&#xff1a;https://www.autosar.org/ 步骤如下图&#xff1a; 比如&#xff0c;如果我们想下载Classic P…

【PHP面试题82】system和exec是用来做什么的?有什么区别

文章目录 &#x1f680;一、前言&#xff0c;PHP中system和exec命令的作用&#x1f680;二、system()函数&#x1f680;三、exec()函数&#x1f680;四、区别和应用场景&#x1f50e;4.1 使用system()函数的应用场景&#x1f50e;4.2 使用exec()函数的应用场景&#x1f50e;4.3…

视频云存储/安防监控EasyCVR视频汇聚平台分发rtsp流时,出现“用户已过期”提示该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

mysql并行效率提升

下面是一个并行读取mysql数据库表的测试程序&#xff0c;测试结果发现&#xff0c;读取10个表&#xff0c;1个个读取&#xff0c;和并行读取10个&#xff0c;效率一样&#xff0c;甚至并行读取还慢很多&#xff0c;这是为什么&#xff1f; con get_db_conn() results {} poo…

Mybatis 建立依赖失败:报错Dependency ‘mysql:mysql-connector-java:8.0.28‘ not found

Mybatis 建立依赖失败&#xff1a;报错Dependency ‘mysql:mysql-connector-java:8.0.28’ not found 解决办法&#xff1a; 写完依赖代码&#xff0c;直接重构&#xff0c;下载依赖。 图片: ![Alt](https://img-home.csdnimg.cn/images/20220524100510.png Mac 版本注意Ide…

1.Flink源码编译

目录 目录 1.1软件安装 1.1.1 jdk 1.1.2 maven 1.1.3 node js 1.2 下载flink源码 1.3 编译源码 1.4 idea打开flink源码 1.5 运行wordcount 1.1软件安装 软件地址 链接&#xff1a;https://pan.baidu.com/s/1ZxYydR8rBfpLCcIdaOzxVg 提取码&#xff1a;12xq 1.1.1 …

Python——列表(list)推导式

本文基于python3。 目录 1、Python推导式2、列表(list)推导式2.1、定义2.2、实际操作2.2.1、一个表达式&#xff0c;后面为一个 for 子句2.2.2、一个表达式&#xff0c;后面为一个 for 子句&#xff0c;然后&#xff0c;跟着if 子句。2.2.3、一个表达式&#xff0c;后面为一个…

华纳云:ubuntu下nginx服务器如何配置

在Ubuntu操作系统上配置Nginx服务器涉及以下步骤。这里我将提供一个基本的配置示例&#xff0c;你可以根据自己的需求进行修改和定制。 安装 Nginx&#xff1a; 打开终端&#xff0c;并输入以下命令来安装 Nginx&#xff1a; sudo apt update sudo apt install nginx 启动 …

【剑指offer】【C语言】调整数组中奇偶数顺序_冒泡法+二分法_调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 示例&#xff1a;{4&#xff0c;6&#xff0c;5&#xff0c;7&#xff0c;2&#xff0c;3…

2023.8 - java - Number类和Math类

一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 然而&#xff0c;在实际开发过程中&#xff0c;我们经常会遇到需要使用对象&#xff0c;而不是内置数据类型的情形。为了解决这个问题&a…

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVMD分解算法&#xff0c;分解结果可视化&#xff0c;MATLAB程序&#xff…

【微服务学习笔记】认识微服务

【微服务学习笔记】认识微服务 单体架构 分布式架构 微服务架构 SpringCloud 服务拆分和注意事项 服务拆分的案例demo 各个服务之间的数据库都是相互独立的&#xff0c;你不能直接访问对方的数据库&#xff0c;只能从一个服务像另外一个服务发起远程调用 在订单模块的服务中 …

【面试经典150题】移除元素·JavaScript版

题目来源 大致思路&#xff1a;遍历数组&#xff0c;如果遇到值为val的元素&#xff0c;使用数组最后一个元素替换它。详细过程&#xff1a; /*** param {number[]} nums* param {number} val* return {number}*/ var removeElement function(nums, val) {let i0,nnums.leng…