大数据=SQL Boy,SQL Debug打破SQL Boy 的僵局

网上经常盛传 大数据=sql boy,后端开发=crud boy,算法工程师=调参boy

在大数据领域也工作了好几年了,确实大数据开发,很多工作就是写sql,hive sql、spark sql、flink sql等等sql

一、背景:

但是经常有这样一个需求,一大段sql 跑出来之后,发现不是自己想要的结果?比如:

demo 1:
select id,name from (
select id,name from table1
union all
select id,name from table2
union all
select id,name from table3
union all
select id,name from table4
)t group by id,name

demo 2:
select a.id,a.name,a.class from (select id,name from table1 where id>=10) a left join (select name,class from table2 where name is not null)
 b on a.name=b.name;

比如说:

demo 1 中的sql 出来这样的结果数据

idname
101xiaolan
102xiaobing
100xiaohong

但是其中id为100的这条数据从业务逻辑上来看应该是被过滤掉的,但是实际却出来了,也就是代码实际运行结果和我们预期想的不一样

其实和c语言开发和java 开发类似,就是预期结果和代码实际结果不一致,一般在java开发或者c语言开发中,我们是通过打日志(print、log.debug )或者使用idea打断点进调试模式进行调试代码,一步一步查看中间结果,也称之为debug过程。

那么因此想到sql 实际运行结果和预期不符的时候能不能进行debug 调试呢?

二、大部分人的解决方案:

大部分数据开发者遇到这个问题,都是把sql 进行拆分,比如说demo 1 的sql拆分如下4个sql,分别对每个sql 进行运行判断100这个结果到底是哪个表产出的。

select id,name from table1 where id='100'

select id,name from table2 where id='100'

select id,name from table3 where id='100'

select id,name from table4 where id='100'

或者稍微修改一下

select * from (
select id,name,flag from (
select id,name,'1' as flag from table1
union all
select id,name,'2' as flag from table2
union all
select id,name,'3' as flag from table3
union all
select id,name,'4' as flag from table4
)t group by id,name,flag )t1 where id='100'

三、最终方案:

那有没有一种方法,也能做到像和java或者c语言一样进行调试中间结果呢,也就是idea debug或者通过打印日志的方式?因此称呼sql 调试的过程为sql debug。

java 或者c 语言 开启debug 模式,需要打印日志或者配合idea 进行debug,本文先讲述怎么通过打印日志进行sql debug。

(1)开启debug 模式

(2)拆分sql

(3)输出中间结果

(4)人工判断中间结果是否正确定位原因

(5)重复2-4过程直到找到最终结果结束

举例:

select u,
       max(tm),
       p1
from
  (
   select device_id as u,unix_timestamp(dt,'yyyy-MM-dd')*1000 as tm,p1
        from test.table1
        where dt='2023-04-09' and length(trim(device_id))>0
        union ALL
        select device_id as u,unix_timestamp(dt,'yyyy-MM-dd')*1000 as tm,p1
        from test.table2
        where dt='2023-04-09' and length(trim(device_id))>0	 
    union all 
     select device_id as u,unix_timestamp(dt,'yyyy-MM-dd')*1000 as tm,p1
     from test.table3
    where dt='2023-04-09' and length(trim(device_id))>0
    
  ) a
GROUP BY u,
         p1

(1)将这样一段sql 进行转换成语法树(如下图),这样就完成了sql解析和拆分(实际上更复杂的sql 也可进行快速拆分)

(2)将拆分出来的sql进行批量建表

(3)实际分析问题的时候,可以直接查询建的中间表数据

(4)分析完成之后需要自动删除建的中间表数据

GitHub - zhugezifang/sql-debug

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开心档之C++ 运算符

目录 C 运算符 算术运算符 实例 实例 关系运算符 实例 实例 逻辑运算符 实例 实例 位运算符 实例 实例 赋值运算符 实例 实例 杂项运算符 C 中的运算符优先级 实例 实例 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&…

【机器学习学习笔记】机器学习入门监督学习

1. 机器学习入门 1.1 What is Machine Learning? ​ "Field of study that gives computers the ability to learn without being explicitly programmed. " ​ ——Arthur Samuel (1959) 亚瑟萨缪尔:跳棋程序编写者 常用机器学习算法: …

泡泡玛特“失速”,盲盒经济迎来拐点?

配图来自Canva可画​ 前些年泡泡玛特的飞速增长,曾经在行业内外引起了广泛的反响,其主打的盲盒经济也曾风靡一时、被众多行业效仿。不过,这种情况在疫情肆虐的2022年似乎受到了一些影响,这在其财报中就有所体现。 3月29日&#…

chatGPT的API一次多少钱-怎么用chatGPT解决问题

如何利用chatGPT解决问题 使用ChatGPT解决问题一般需要以下几个步骤: 确认问题类型:在使用ChatGPT解决问题前,需要明确问题的类型,如文本生成、文本分类、机器翻译、情感分析等。 准备数据和模型:ChatGPT需要数据和模…

​如何处理Xcode上传IPA文件后无法在后台架构版本中显示的问题?

如何处理Xcode上传IPA文件后无法在后台架构版本中显示的问题? AU上传ipa出现下图红框提示说明成功上传,但有时App Store后台没有出现构建版本,请查看下面详细说明! 一、首先登录iTunes Connect 后台、查看ipa构建情况 https://ap…

2023疫情当头,3个月转行软件测试拿下8k+offer,我心满意足了

从2020年的疫情开始,全世界好像按下了暂停键一般,大量新网民涌入互联网。我们的生活方式也随之改变,失业也如洪流般席卷整个世界,宅家的人数在变多,当然大多数人开始寻求新的工作方式,随之进军互联网的人开…

辉煌优配|A股上市银行拟合计派现超5300亿元 14家股息率在5%以上

A股上市银行是现金分红大户,国有银行和部分股份行更是占据了“A股上市公司丰厚报答榜”近一半的名单。 当时,A股上市银行已有23家在2022年年报中发表了分红预案,除郑州银行没有现金分红计划外,其余上市银行均公布了现金分红计划。…

Elasticsearch 8.X 如何基于用户指定 ID 顺序召回数据?

1、实战问题如何根据输入的id 的顺序输出结果,id 个数有500个,还有分页?问题来源:https://t.zsxq.com/0cdyq7tzr2、方案探讨2.1 Elasticsearch 默认排序机制在 Elasticsearch 中,如果未指定排序规则,检索结…

android framework-init进程

一、init进程简介 init进程是用户空间的第一个进程,它的进程pid为1 二、init进程详解 涉及的源码路径: android-10.0.0_r41\system\core\init\main.cppandroid-10.0.0_r41\system\core\init\first_stage_init.cppandroid-10.0.0_r41\system\core\ini…

后缀为whl的文件是什么?如何安装whl文件?学习一下(22)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 了解并使用Pyhton的库安装包文件whl。 什么是whl文件 whl格式本质上是一个压缩包,里面包含了py文件&am…

【荐读】三读上古遗迹之《人月神话》

序 ##昨夜西风凋碧树。独上高楼,望尽天涯路。 第一次读还是学生的时候,那时候读的很艰难,根本理解不了描述的情况,那时候还是200年,好多人对于这本被好多人奉为圣经的书,没有什么具体的感受,仅仅…

1.4 无穷小与无穷大

博主简介:一个爱打游戏的计算机专业学生博主主页:夏驰和徐策 所属专栏:程序猿数学之高等数学思维导图: 我的理解: 无穷小是微积分中一个重要的概念,它描述了当自变量趋近于某个值时,一个函数相…

通讯录(静态版+动态版+文件版)

本期带大家一起来学习一下通讯录的三个版本(静态版动态版文件版)🌈🌈🌈 文章目录一 、代码搭建:🎈二 、代码思路:🎈🎈三、代码实现🎈&#x1f388…

ChatGPT 与 Midjourney 强强联手,让先秦阿房宫重现辉煌!

Midjourney 是一款非常特殊的 AI 绘画聊天机器人,它并不是软件,也不用安装,而是直接搭载在 Discord 平台之上,所有的功能都是通过调用 Discord 的聊天机器人程序实现的。要想使用 Midjourney,只能进入他们的 Discord 服…

ChatGPT如何写作-chatGpt自动写文章

ChatGPT如何写作 使用 ChatGPT 进行写作一般可以遵循以下步骤: 定义写作主题和目的。确定写作主题和目的,包括要解决的问题、目标读者群体以及需要涵盖的主要内容。 收集文献和资料。收集与主题相关的文献和资料,可以从互联网、书籍、报刊杂…

ECF机制:信号 (Signal)

💭 写在前面:ECF (异常控制流) 机制是存在于系统的所有层级中的,所以这一块的知识我们需要系统地去学习。前几章我们探讨过了异常 (Exceptions),由硬件触发,在内核代码中处理。讲解了进程的上下文切换 (Process Contex…

Anaconda详细安装使用

如果想在conda里面删除某个环境,可以使用 conda remove -n name --all 来删除。 其中 conda info --envs 是查看环境,切换环境 activate base 。 Anaconda Anaconda | The Worlds Most Popular Data Science PlatformAnaconda is the birthplace of Pyt…

iosApplePay

1、Apple Pay 接入工程 - 简书 // 设置币种、国家码及merchant标识符等基本信息 PKPaymentRequest *payRequest [[PKPaymentRequest alloc]init]; payRequest.countryCode "CN"; //国家代码 payRequest.currencyCode "CNY"; //RMB的币种代码 …

SpringBoot + MyBatisPlus实现Yaml配置参数AES算法加密

文章目录SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密1概述2 密钥加密3 Yaml参数配置4 使用方式SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密 1概述 该功能为了保护数据库配置及数据安全,在一定的程度上控制开发人员流动导致敏感信息泄露。Mybati…

vue项目proxyTable配置

前言: proxyTable是一个用于Vue.js应用程序的配置选项,它允许您在开发过程中代理后端API请求。这一功能的作用是解决由于浏览器的同源策略所限制而导致的跨域请求问题。当前端应用程序部署在一个Web服务器上并向不同的后端API发送请求时,这个…
最新文章