mysql grouping sets_Hive.GROUPINGSETS的“陷阱”

2023-11-04

之前整理了一下Hive 0.10版引进的GROUPING SETS子句特性,并作了简单的句法使用体验和数据验证。但是当时没有注意到稍微复杂一点的情况,然后,在实际使用过程中,妥妥地就中了一枪。 这一枪发生在有JOIN操作的时候,情况是这样的:我要对Hive表data_table的

之前整理了一下Hive 0.10版引进的GROUPING SETS子句特性,并作了简单的句法使用体验和数据验证。但是当时没有注意到稍微复杂一点的情况,然后,在实际使用过程中,妥妥地就中了一枪。

这一枪发生在有JOIN操作的时候,情况是这样的:我要对Hive表data_table的a, b, c这3个字段去统计UV和VV这两个数据,并需要由c上卷到b,再上卷到a的统计数据。同时,要对字段b的值进行值映射,这是通过和另外一个专门描述b值的表进行JOIN来实现的。HQL语句如下:

select

t1.a_desc,

if(t1.group_bitvector= 1, '未区分', t2.b_desc) as b_desc,

if(t1.group_bitvector= 1 or t1.group_bitvector = 3, '未区分', t1.c_desc) as c_desc,

t1.group_bitvector,

t1.act_uv,

t1.act_vv

from

(

select

a_desc,

b,

c_desc,

grouping__id as group_bitvector,

count(distinctuer_ID) as act_uv,

(sum(if(vv_ID is null, 1, 0)) + sum(if(vv_ID = "", 1, 0)) + count(distinct if(vv_ID is not null, if(vv_ID != "", vv_ID, null), null))) as act_vv

from

(

select

(

case a

when 0 then 'str_val_1'

when 1 then 'str_val_2'

when 2 then 'str_val_3'

else 'str_val_4'

end

)as a_desc,

b,

if(c= -2 or c = -1 or c = 9, 'c_desc1', 'c_desc2') as c_desc,

uer_ID,

vv_ID

from data_table

where a = xxx

) t

group by a_desc, b, c_desc

grouping sets (a_desc,(a_desc, b),(a_desc, b, c_desc))

) t1 join dim_table t2 on (t1.b = t2.b)

跑出来数据,晃眼一看,是正常的,仔细一看就经不起眼睛的考验了,group_bitvector这一列貌似缺了一个值,这样GROUPING SETS下来,group_bitvector应该出现1, 3, 7这三个值,但是出来的数据竟然没有1,也就是说,缺了最顶层的聚合(只对a进行求聚合)数据!

用力想了想,才拍脑袋发现了这个微妙的错误,JOIN君扔掉了一些数据!GROUPING SETS不是会把GROUP BY子句中没有参与聚合的列置为NULL么,这些NULL值在JOIN的时候就被无情地抛弃了。。。这个时候,LEFT OUTER JOIN勇敢地站了出来,它说:只要用我替换原来的JOIN(内连接),就可以漂亮地消除了数据被过滤的问题:

select

t1.a_desc,

if(t1.group_bitvector= 1, '未区分', t2.b_desc) as b_desc,

if(t1.group_bitvector= 1 or t1.group_bitvector = 3, '未区分', t1.c_desc) as c_desc,

t1.group_bitvector,

t1.act_uv,

t1.act_vv

from

(

select

a_desc,

b,

c_desc,

grouping__id as group_bitvector,

count(distinctuer_ID) as act_uv,

(sum(if(vv_ID is null, 1, 0)) + sum(if(vv_ID = "", 1, 0)) + count(distinct if(vv_ID is not null, if(vv_ID != "", vv_ID, null), null))) as act_vv

from

(

select

(

case a

when 0 then 'str_val_1'

when 1 then 'str_val_2'

when 2 then 'str_val_3'

else 'str_val_4'

end

)as a_desc,

b,

if(c= -2 or c = -1 or c = 9, 'c_desc1', 'c_desc2') as c_desc,

uer_ID,

vv_ID

from data_table

where a = xxx

) t

group by a_desc, b, c_desc

grouping sets (a_desc,(a_desc, b),(a_desc, b, c_desc))

) t1 left outer join dim_table t2 on (t1.b = t2.b)

这个场景中,grouping__id这个函数的用处也显现出来了,要是没有它,缺数据的问题更容易被忽视。。。

最后,如果是多重或多列进行JOIN,就尤其要注意这个问题了~~~利用LEFT OUTER JOIN和GROUPING__ID的返回值,还是你能够很清晰无误地表达查询数据并进行GROUP组区分的需求。

最后的最后,还有一颗小小的地雷:gouping__id的返回值竟然是字符串类型,而不是直观上看到的整型!有时候Hive会自动为我们处理整型和字符串类型间的解析,毕竟字符串的很多运算和整型运算很相似。但有时候Hive也不会给我们处理,比如在用case…when…then…end子句的时候,字段数据类型必须严格相同,否则会报错,——虽然这个错误提示很明显,比较容易排查。

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql grouping sets_Hive.GROUPINGSETS的“陷阱” 的相关文章

  • Django笔记总结

    1 web框架的本质 web通信流程 web我们这里指的就是通过浏览器去访问服务端 请求页面或者数据的通信方式 属于B S架构 就是我们常见的网站 浏览器与服务端的通信流程 浏览器客户端发送一个请求信息 数据 发送到我们服务端 服务端接受这
  • 使用强随机数

    伪随机数易被攻击者破解而找到其数序生成规律 伪随机数不能用于安全敏感应用 常见安全敏感应用 SessionID的生成 挑战算法中的随机数生成 验证码的随机数生成 生成重要随机文件的文件名 生成密钥相关的随机数等 对于安全敏感应用 应该使用强
  • H3C交换机堆叠(IRF)

    目录 1 IRF简介 1 1 实验环境 1 2 添加交换机 1 3 添加连接线 1 4 启动设备 1 5 修改设备名称 1 6 关闭IRF物理端口 1 7 设置IRF域编号 1 8 设置member成员编号 1 9 配置IRF端口并与物理端
  • 使用ESP8266和Blynk应用程序的远程房间恒温器

    该项目可通过您的手机通过家庭WiFi或移动网络的任何地方控制您的家庭供暖单元 基本上 它可以用远程控制器代替普通的可编程房间恒温器 作为遥控器 它使用安装了Blynk App并配置为可以满足所有需求的智能手机 智能手机和供暖系统之间的通信由
  • Android 9(P)应用进程创建流程大揭秘

    Android 9 P 应用进程创建流程大揭秘 Android 9 P 系统启动及进程创建源码分析目录 Android 9 P 之init进程启动源码分析指南之一 Android 9 P 之init进程启动源码分析指南之二 Android
  • 【面试题】-java分布式及微服务面试题汇总

    目录 1 CAP理论 2 BASE理论 3 接口的幂等性问题 4 消息中间件如何解决消息丢失问题 5 什么是分布式事务 分布式事务的类型有哪些 6 分布式事务的解决方案有哪些 7 Dubbo的服务请求失败怎么处理 10 Soa和微服务架构有
  • 二叉树中序线索化与遍历(c)

    对下图的二叉树进行 1 创建一个带线索域的二叉树 数据类型如下 typedef struct 当 tag 为0时 代表child 正常指向下一个节点 当tag为1时 child为线索 其中 lchild 为指向中序遍历前驱 rchild 为
  • 中级职称的计算机考试题库,中级职称计算机考试模拟题库及答案

    资料仅供参考 中级职称计算机考试模拟题库及答案 1 计算机中数据的表示形式是 C A 八进制 B 十进制 C 二进制 D 十六进制 2 硬盘工作时应特别注意避免 B A 噪声 B 震动 C 潮湿 D 日光 3 下面列出的四种存储器中 易失性
  • 好像还挺好玩的GAN5——Keras搭建COGAN耦合生成式对抗网络

    好像还挺好玩的GAN5 Keras搭建COGAN耦合生成式对抗网络 学习前言 什么是COGAN 神经网络构建 1 Generator 2 Discriminator 训练思路 实现全部代码 学习前言 发现一个挺有意思的结构 可以通过同一个输
  • Unity实现扇形小地图的区域检测

    说明 最近接到一个需求 在一个雷达界面 扇形UI 的界面上显示出三维场景中真实的物体显示情况 我的思路就是一个三维场景某物体的位置映射到二维UI界面上 实现思路 物体到扇形原点的距离需要小于扇形半径的距离 否则就不在扇形范围内 物体与扇形原
  • 【git】 无法commit问题

    今天写完代码git commit m 一下发现提示 Another git process seems to be running in this repository e g an editor opened by git commit
  • 2022-10-20 Linux LED灯驱动gpio-leds心跳呼吸灯heartbeat、timer,路径/sys/bus/platform/devices/leds

    一 测试环境 Android 9 系统 二 驱动文件在 kernel drivers leds leds gpio c 三 dts的官方配置文档 kernel Documentation devicetree bindings leds l
  • Idea 使用技巧(MAC)

    记住符 打标快捷键 Ctrl Shift 任意数字 查标快捷键 Ctrl 任意数字 在Idea查看标签相关操作 Navigate Bookmarks 快捷键设置 intellij Preferencs keyMaps 快捷键 顶部 fn c
  • crontab每分钟执行一次任务

    0 实例 在 home 下面写了一个test sh bin sh echo hello gt home hello txt echo hello hello hello hello gt gt home hello txt 还是用这个比较好
  • 五、C++语言初阶:文件

    5 文件 5 1 流 流 数据从一个对象到另一个对象的传输 功能 标准输入输出 文件处理 分类 含义 文本流 一串ASCII字符 二进制流 一串二进制 5 2 流类型 标准库定义了三大类流类型 标准I O流 文件流 字符串流 标准I O流
  • Kaggle 数据竞赛

    文章目录 一 前言 二 主要内容 1 评估 2 时间线 3 奖金 4 代码要求 三 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 使用机器学习技术 通过匿名健康特征的测量数据来检测疾病 比赛目
  • 动力节点最新Java17零基础视频第二章 初识Java

    计算机概述 计算机是一种现代化的电子设备 它能够接受 存储 处理和输出数据 计算机由硬件和软件两部分组成 硬件包括中央处理器 CPU 内存 硬盘 显示器 键盘 鼠标等部件 软件则包括系统软件和应用软件 计算机可以进行各种操作 如文字处理 图

随机推荐

  • 当定制化的呼声响起,MaaS就在百融云的掌心

    中国的TMT产业 似乎每隔几年都要经历一轮痛苦的反思 而这次的新课题 是AI到底能不能拯救中国的软件行业 大洋彼岸的Adobe 用订阅制付费牢牢拴住离不开自己的专业视频剪辑用户 Shopify用收租的模式 为电商卖家提供搭建网店的技术和模版
  • BigDecimal基本知识

    在我们的日常计算中 有时会涉及到比较大的数字之间的计算 如 超大金额的计算 如果是韩元等的话 还要大 这时 使用float double这样的浮点数就不那么准确了 因为不论是float 还是double都是浮点数 而计算机是二进制的 浮点数
  • 如何使用github中的pull request功能?

    pull request是社会化编程的象征 通过这个功能 你可以参与到别人开发的项目中 并做出自己的贡献 pull request是自己修改源代码后 请求对方仓库采纳的一种行为 github入门与实践 下面具体说一下github中使用pul
  • Unity TimeLine实用功能讲解

    这一个技术相对于其他动画系统 最大的区别就是 TimeLine针对多个游戏物体做出的一系列动画 主要用于过场动画的制作 实现电影级的那种分镜效果 注意 使用TimeLine需要2017以上的版本 在菜单栏中点Window 找到TimeLin
  • uView 中 Steps 步骤条,竖向步骤条不展示

    问题描述 Steps 步骤条在竖向时候步骤条竖线不展示 解决方法 找到uview ui components u steps item u steps item vue文件 设置 style height 100 即可 如图
  • 如何在MacOS上玩儿汇编?

    在Mac上写汇编还是相当方便的 本文通过写一个Helloworld程序来入门 首先 MacOS 自带nasm 只是版本有点老 编译不了64位程序 只要上官网下一个最新的 替换一下就行了 有一点需要注意的是mac上gcc编译 o文件的默认入口
  • jquery笔记

    收起展开
  • mysql8安装以及配置、参数优化

    1 配置bin到path 2 mysql解压版本在根目录创建my ini 3 初始化数据库 mysqld initialize console 这里会生成一个初始密码 需要记录下来 否则需要删除datadir目录重新初始化 D dev my
  • Math 对象

    Math 用于执行数学任务 不像 Date 和 String 那样是对象的类 因此没有构造函数 Math 方法 Math ceil 对小数进行上舍入 Math ceil 25 5 返回26 Math ceil 25 5 返回 25 Math
  • 如何使用百度baidu对某个特定网站进行站内搜索/检索

    很多网站自己提供了站内搜索 检索的功能 比如说GitHub或一些购物网站 但是也有很多网站并没有提供站内检索的功能 此时可以利用百度baidu对特定的网站进行检索 方法很简单 在要检索的关键字前加上inurl 和网址即可
  • 【Qt Creator快速入门第三版学习笔记】——第1章 Qt Creator简介

    第1章 Qt Creator简介 文章目录 第1章 Qt Creator简介 前言 1 1 Qt Creator的下载与安装 1 2Qt Creator环境介绍 1 2 1 主界面介绍 1 菜单栏 Menu Bar 2 模式选择器 Mode
  • ceres-solver库编译说明

    0 ceres solver简介 Ceres Solver是一个C 环境下的非线性最小二乘问题的求解工具包 可用来建模并解决大型复杂的非线性最小二乘问题 这个工具包已经广泛被用于很多商业软件中 在google project里面有它的主页
  • Oracle PL/SQL使用动态SQL

    动态SQL 意思是字符串的内容的内容当做SQL来执行 语法 execute immediate 字符串内容 execute 存储过程 参数 连接符 把左右两边的字符串的字符串连起来 合起来一个字符串 count 遇到的情况和对策 1 非查询
  • 集合框架集-List

    1 UML 统一建模语言 例如 类图 用例图等等 2 Collection接口 1 1 集合框架的顶级接口 1 2 是Set和List的父接口 1 3 但不是Map的父接口 集合中只能添加引用类型数据 Collection接口 是集合框架的
  • Unity3d Note5(鼠标打飞碟(Hit UFO)游戏)

    1 作业要求 2 具体设计 1 制备预制体作为飞碟 2 了解一下Singleton模板类 3 了解一下工厂模式 3 设计具体要实现的类 3 程序代码 成果视频 1 作业要求 编写一个简单的鼠标打飞碟 Hit UFO 游戏 游戏内容要求 游戏
  • Oracle 取出动态sql 执行的结果的两种方式

    以下是怎么取出动态sql执行结果的两种方式 第一种 直接 execute immediate insert into newTable id name select id name from dual 执行后 放到一个新的表里 第二种方式
  • JDBC、MAVEN概述

    1 什么是JDBC JDBC Java DataBase Connectivity Java数据库连接 其实就是 利用Java语言 程序连接并访问数据库的一门技术 之前我们可以通过CMD或者navicat等工具连接数据库 但在企业开发中 更
  • 本地访问远程web服务

    1 2 以管理员身份运行cmd ssh username remote address L 127 0 0 1 8888 127 0 0 1 8008 3 在远程服务器上去运行web服务 4 本地访问
  • 设置flex:1效果异常(父容器撑高/其它子元素高度缩小)

    先讲解决方案 1 自动占满容器 设置height min height 0 2 设置overflow hidden 原理是flex内容溢出原理 1 开发中想利用flex 1实现容器自动占满剩余高度 效果如下图 2 实现的时候div3是一个容
  • mysql grouping sets_Hive.GROUPINGSETS的“陷阱”

    之前整理了一下Hive 0 10版引进的GROUPING SETS子句特性 并作了简单的句法使用体验和数据验证 但是当时没有注意到稍微复杂一点的情况 然后 在实际使用过程中 妥妥地就中了一枪 这一枪发生在有JOIN操作的时候 情况是这样的