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

这篇具有很好参考价值的文章主要介绍了Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

使用的集群环境为:

  • 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 Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!,hive,sql,大数据,spark sql,数据仓库
需求:获取某一个区间内周一至周日每天各个商品的售卖量,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;

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

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!,hive,sql,大数据,spark sql,数据仓库
在我验证结果的时候,第一行就出现了错误,查看订单详情信息测试表发现,sku_id1 的商品在 2021-09-27(周一)这天售出了 2 件商品;

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

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!,hive,sql,大数据,spark 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;

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

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!,hive,sql,大数据,spark sql,数据仓库

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

如下所示:

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!,hive,sql,大数据,spark sql,数据仓库
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"

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!,hive,sql,大数据,spark sql,数据仓库

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

但只要我加上 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()

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!,hive,sql,大数据,spark sql,数据仓库

最终的结果是正确的。

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

我不是正经人…

总结

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

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

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

并不会出现该BUG。文章来源地址https://www.toymoban.com/news/detail-665374.html

到了这里,关于Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (十七)大数据实战——Hive的hiveserver2服务安装部署

    HiveServer2 是 Apache Hive 的一个服务器端组件,用于支持客户端与 Hive 进行交互和执行查询。HiveServer2服务的作用是提供jdbc/odbc接口,为用户提供远程访问Hive数据的功能。HiveServer2 允许多个客户端同时连接并与 Hive 交互。这些客户端可以通过 JDBC、ODBC 或 Thrift API 连接到 HiveServe

    2024年01月17日
    浏览(29)
  • 【Hadoop】-Hive客户端:HiveServer2 & Beeline 与DataGrip & DBeaver[14]

    在启动Hive的时候,除了必备的Metastore服务外,我们前面提过有2种方式使用Hive: 方式1: bin/hive 即Hive的Shell客户端,可以直接写SQL 方式2: bin/hive --service hiveserver2 后台执行脚本: nohup bin/hive --service hiveserver2 logs/hiveserver2.log 21 bin/hive --service metastore ,启动的是元数据管理服务

    2024年04月28日
    浏览(28)
  • 常见的bug---3、没有启动metaStore和Hiveserver2服务导致在本机上的IDEA无法连接上虚拟机上的HIve

    在IEDA连接虚拟机上的Hive报的 Exception in thread “main” org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:11

    2024年02月15日
    浏览(36)
  • Error: Could not open client transport with JDBC Uri: jdbc:hive2://解决连接beenline连接HiveServer2报错

    目录 一、错误现象 二、 解决方案 三、其他解决方式 背景:ranger 整合cdh后登陆HiveServer2测试 后台日志 Error: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop105:10000: Failed to open new session: java.lang.IllegalArgumentException: Cannot modify hive.query.redaction.rules at runtime. It  is not in list of

    2024年02月12日
    浏览(34)
  • HiveServer2 Service Crashes(hiveServer2 服务崩溃)

    Troubleshooting Hive | 5.9.x | Cloudera Documentation 1.hive分区表太多(这里没有说具体数量。) 2.并发连接太多,我记的以前默认是200个连接  3.复杂的hive查询访问表的的分区 4.hs2实例数太少 如果存在这些情况中的任何一种,Hive可能运行缓慢,或者可能崩溃,因为整个HS2堆内存已满。 S

    2024年02月07日
    浏览(30)
  • HiveServer2负载均衡

    有多个HiveServer2服务时,可以借助Zookeeper服务实现访问HiveServer2的负载均衡,将HiveServer2的压力分担到多个节点上去。本文详细介绍HiveServer2负载均衡的配置及使用方法,请根据EMR集群(普通集群和Kerberos集群)的实际情况进行选择。 hive.server2.support.dynamic.service.discovery 设置为

    2024年02月06日
    浏览(24)
  • hiveserver2经常挂断的原因

    HiveServer2 经常挂断可能有多种原因,以下是一些可能导致挂断的常见原因: 资源不足:HiveServer2 需要足够的内存和 CPU 资源来处理查询请求。如果资源不足,可能会导致 HiveServer2 挂断。请确保在配置 HiveServer2 实例时分配了足够的资源。 配置问题:不正确的配置可能导致 Hi

    2024年02月06日
    浏览(27)
  • HiveServer2 常见异常和处理方法

    可能原因: HiveServer 连接数达到上限。因为每个 jdbc,HiveServer 需要一个线程。 HiveServer OOM 不能及时处理客户请求 Hive Metastore 没有响应或者后台数据库卡住。 HiveServer2 Server socket 的 backlog 默认是 0,在centos 系统中查看 HiveServer2 的 backlog 是50。当Socket accept 的速度变慢,操作系

    2024年02月03日
    浏览(33)
  • 合并文件解决HiveServer2内存溢出方案

    • 表文件数量为6522102 • 分区为string 类型的time字段,分了2001个区。 •可以看到Jvm内存使用明显增大,Hiveserver2内存溢出,进程挂掉了;查看HiveServer2状态标红。 •详细日志如下 • 将每个分区里的若干个小文件合并成一个文件,最终文件个数为分区数。合并流程如下: 2.1.

    2024年02月11日
    浏览(28)
  • hue实现对hiveserver2 的负载均衡

    如果你使用的是CDH集群那就很是方便的 在Cloudera Manager中,进入HDFS Service 进入Instances标签页面,点击Add Role Instances按钮,如下图所示 点击Continue按钮,如下图所示 返回Instances页面,选择HttpFS角色,并点击Start启动服务,如下图所示 HttpFS服务启动后,点击进入Hue Service Configur

    2024年02月08日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包