Maxcompute-UNION数据类型对齐的方法

第1章 问题概述

1.1 UNION中隐式类型转换问题

近期参与的一个私有云项目要升级,因为maxcompute要升级到更新的版本,对之前的一些SQL写法有个更高的要求,就引出了这个union隐式转换的问题。运维同学扫描到内部的异常是:
union.string.meet.non.string。 在ODPS某些模式中在union两侧对应列如果类型不同时会尝试隐式类型转换,其行为是一边为string,另一边为数字或datetime类型时,转为另一边的类型(string)。然而绝大多数的数据库或者开源生态而言,使用的都不是这种转换规则,比如hive,mysql等会优先转成string。这种不确定的转换规则有时候会很危险,如用户从hive往odps迁移时,可能会导致无声无息的精度损失,语义错误等。 ODPS2.0为了安全禁止此隐式类型转换(这也是目前oracle的默认行为),如果需要请使用CAST函数。(之前好好的,现在要报错了)所以现在项目组要求脚本作者检查自己脚本,明确要转到的类型,如果需要加入显式转换。

例:

select * from (--(错误)select a_bigint c1 from t1 union allselect a_string c1 from t2) x;  

-- 如果希望结果c1为bigint类型(这是目前ODPS的行为),改为

select * from (--(正确)select a_bigint c1 from t1  union all select cast(a_string as bigint) c1 from t2) x; 

-- 如果希望结果c1为string类型(这是目前HIVE的行为),改为

select * from (--(正确)select cast(a_bigint as string) c1 from t1  union all select a_string c1 from t2) x; 

1.2 问题分析

因为还未升级,目前脚本也不会报错,maxcompute的异常我们也捕获不到,改造的压力有点纯靠肉眼识别了,着实有点难过。

错误示例:

select 123 as aa,0 as abfrom xlogunion ALL select getdate() as aa,0 as abfrom xlog;FAILED: ODPS-0130241:[4,8] Illegalunion operation - type mismatch for column 0 of UNION, left is BIGINT while right is DATETIME

--注释:这里的[4,8]是指第四行,第八个字符开始也就是getdate().

那怎么去快速的定位到是哪个字段呢?我翻了一下后台检索出来的上百个脚本,脚本代码在500-1000行之间居多,union 的数量在单个脚本中少则三五个,多的有二十几个。呆了一早上,毫无进展。

第2章 问题解决

简单的思考了一下,要想获得Union的两个表数据类型是否对齐,就得看下原来表结构中的数据类型,目标表结构的数据类型,还需看一下代码找到SQL逻辑执行后的数据类型,这样才能找到哪些字段数据类型不一致。

于是按照这个思路开始看,第一个脚本的代码就1000多行,union的表字段数量也是100多个,union还有6个。直接懵了,完全肉眼无法识别。一早上就这么过去了,不但一个没有搞定,还把自己搞烦了。

2.1 利用执行计划

一抽莫展之际,突然想到了执行计划。MaxCompute的执行计划,虽然会不会刚好会展示输出的数据类型呢?答案:会的。

explainselect 123 as aa,0 as abfrom xlog;Job Queueing... job0 is root jobIn Job job0:root Tasks: M1In Task M1: Data source: mujiao.xlog    TS: mujiao.xlog        SEL: 123L aa, 0L ab            FS: output: Screen                schema:                  aa (bigint)                  ab (bigint)OKexplainselect getdate() as aa,0 as abfrom xlog;;Job Queueing...job0 is root jobIn Job job0:root Tasks: M1In Task M1: Data source: mujiao.xlog    TS: mujiao.xlog        SEL: 1655965081824 aa, 0L ab            FS: output: Screen                schema:                  aa (datetime)                  ab (bigint)OK

我们看到在FS:output:Screen 下面是schema:aa(bigint),ab(bigint)。这就是我们可以利用的数据类型了。所以,我们可以把长脚本中的union一段一段的explain,然后截取这部分内容,比较多个schema的不同。

schema1:        schema2: aa (bigint)     aa (datetime)   ab (bigint)     ab (bigint)

这样就肉眼可视的发现其实union中两段SQL的字段aa是不同的。

2.2 其他问题

其他相关的一些问题:

1) 执行计划中的max_pt()函数无法在开发环境使用,因为开发环境没有分区,这个函数会直接报错。要么删除、注释这个函数,要么在表前面增加生产环境前缀。

2) 超长的SQL段,执行计划可能有几百行上千行,找不到最终的output。可以在日志中搜索“output: Screen”这段对应的就是最终的输出。

3) 太多的字段,肉眼无法判断哪些类型不一样的时候,建议在excel中来比较,利用excel的筛选能力,逐个数据类型筛选比较。

4) 执行计划在特别的情况下可能出不来,使用create table as创建一个临时表来识别SQL输出的数据类型,然后再desc表结构。不过每个字段都要给一个名称,在create table的时候,还有null这种写法也是需要cast后给一个明确的数据类型。

5) 日期转换,因为string到日期转换的格式化类型不是能猜出来的,建议实际看一下数据格式,不要猜测。否则只能线上运行后,报错才能排查出问题。

6) 对于Null值,可以cast(null as datetime)、cast(null as double)给字段赋值。

即便这些都可以,对于数百个长达几百行的脚本来说,这项工作都足以让你烦躁不安失去耐心。建议研发同学还是劳逸结合,再就是日后把这个工作变成一个习惯。一大段SQL的union,就直接先explain,别等报错一个一个看心烦。

最后,你会发现这一切的缘由还是我们的基础工作没有做好。既然是union一起的数据字段,理论数据类型和值域是一模一样的,怎么会出这种问题。标准化的数据应该是日期就是日期,数值就是数值,字符就是字符,不会数值存储成字符、日期存储成字符。显然,现在的痛苦还是来源于之前的工作缺失,做好每一步,后面会越来越轻松。

2.3 另外一个方法

后来跟研发同学要到了一个可以让warning信息显示出来的提示。

setodps.compiler.warning.disable=false;sql running .....WARNING:[4,8] implicit conversion from bigint to datetime,use cast function to suppress

这个warning会让所有的隐式转换都抛出来,在现场环境中,明显比我实际按照explain的方法判断出来的要多很多。这两种方法,在实际使用中该如何使用,大家可以自行判断。

祝大家好运!

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

50 万开发者不愿付费使用,Python 代码补全神器 Kite 失败!

作者 | 苏宓出品 | CSDN(ID:CSDNnews)AI 编程距离程序员还有多远?如果说 GitHub Copilot 的到来,让众多开发者看到了希望,那么初创公司 Kite 的倒闭,也让我们认清了现实。Kite 是一家使用 AI 帮…

模拟 IDC spark 读写 MaxCompute 实践

一、背景 1、背景信息 现有湖仓一体架构是以 MaxCompute 为中心读写 Hadoop 集群数据,有些线下 IDC 场景,客户不愿意对公网暴露集群内部信息,需要从 Hadoop 集群发起访问云上的数据。本文以 EMR (云上 Hadoop)方式模…

基因检测,如何帮助患者对抗疾病?

为什么别人胡吃海塞都依然瘦成竹竿,我喝水都会胖? 为什么我这么不幸,疾病会找上我?早知道就不乱喝酒。 为什么是同一种病,别人吃这个药有用,我吃却没用? 从日常的健康管理、疾病预防&#xf…

“小语言”才是编程的未来!

摘要:随着软件功能不断增加,代码数量也日益膨胀,我们要如何停止不断堆砌,甚至缩小软件体积?本文作者提出了一种可能性:“小语言”。链接:https://chreke.com/little-languages.html声明&#xf…

夯实密码基础服务,服务上层应用

“十四五”是国家数字化战略转型建设的关键阶段,5G、人工智能、云计算、大数据等新一代信息技术进一步加快了工业和信息化领域数字化转型的步伐。与此同时,也带来了新的网络安全风险。加快推动商用密码与新一代信息技术的深度融合和协同创新,…

储留香:数据迁移上云避坑指南

简介: 常言道:人往高处走,水往四面八方流,而让数据如水一般流动则是IT人孜孜以求的。那么在如今这个风起“云”涌,不管是上云,还是换云都涉及到数据迁移的时代,如何做到这一点呢?今天…

为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(下)

在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答。 1、Serverless Devs 和 Terraform 的关系 可能有些用户会问,既然你们已经支持了 Terraform,那 Serv…

这个简单的小功能,半年为我们产研团队省下213个小时

大多数人对产研同学的认知都是每天做着高大上的活儿。 我们以为的产研团队是: 研发负责人:今年最新的技术架构是什么、我的团队适合吗?开发同学:010001,一顿代码猛如虎测试同学:OK,测试一次性…

腾讯云开源项目Crane成FinOps首个认证降本增效开源方案

刚刚,腾讯云开源项目 Crane(Cloud Resource Analytics and Economics)正式成为FinOps认证解决方案(FinOps Certified Solutions)。作为全球范围内首个开源的FinOps认证解决方案,Crane能够助力云原生用户充分发挥云上资源的最大价值…

JDBC 在性能测试中的应用

前言 我们能否绕开 http 协议,直接测试数据库的性能?是否觉得从数据库中导出 CSV 文件来构造压测数据很麻烦?怎样在压测结束后做数据清理?能不能通过数据库中的插入(删除)记录对压测请求做断言&#xff1f…

不喜欢 D 和 C++,程序员将 58000 行代码移植到 Jai 语言?

摘要:将已有的上万行代码迁移至另一种编程语言,从来就不是一件容易决定的事情,而本文作者却信心满满地要将 5.8 万行代码全部用另一种不那么主流的语言重写,这是为什么呢?链接:https://www.yet-another-blo…

传统微服务框架如何无缝过渡到服务网格 ASM

背景 软件技术的发展历史,从单体的应用,逐渐演进到分布式应用, 特别是微服务理念的兴起,让大规模、高并发、低延迟的分布式应用成为可能。云原生时代下,微服务框架本身也在不断地进化和迭代演进。 微服务框架一般会涉…

基于 K8s 的交付难题退退退!

大家好,我是专注于交付的王小锤,看过交付铁三角系列故事(专注交付的我小锤,开发老哥铁子和售前大佬强哥)的同学想必都知道,我们三人服务于一家提供大数据分析服务的 ISV 企业,在应用交付过程中时…

小迈科技 X Hologres:高可用的百亿级广告实时数仓建设

通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。 一、业务介绍 小迈科技成立于 2015 年 1 月,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司。始终坚持以用户价值为中心,以数据…

移动云探索自主技术核心地带,拥抱开发者共筑全新技术生态

在数字经济向更多新领域渗透,5G、物联网等数字经济核心技术应用加速的助推下,云计算作为最主流的算力解决方案,需求增长迅速。随着国内云计算技术生态发展的不断成熟,各行各业上云的步伐也在不断加快。同时,由于企业的…

深度解读 RocketMQ 存储机制

RocketMQ 实现了灵活的多分区和多副本机制,有效的避免了集群内单点故障对于整体服务可用性的影响。存储机制和高可用策略是 RocketMQ 稳定性的核心,社区上关于 RocketMQ 目前存储实现的分析与讨论一直是一个热议的话题。本文想从一个不一样的视角&#x…

IOC-golang 的 AOP 原理与应用

AOP 与 IOC 的关系 AOP (面向切面编程)是一种编程设计思想,旨在通过拦截业务过程的切面,实现特定模块化的能力,降低业务逻辑之间的耦合度。这一思路在众多知名项目中都有实践。例如 Spring 的切点 PointCut 、 gRPC的…

达摩院技术创新全景|懂你的语音AI

过去十年,语音AI从实验室走向应用,语音搜索、交互早已融入日常。本文将带你一览达摩院语音AI技术创新全景,一起感受能听、会说、懂你的语音AI。 当你在家中与智能音箱进行交互对话,当你使用天猫超市或菜鸟裹裹,接到机器…

闲鱼对 Flutter-Native 混合工程解耦的探索

1. 闲鱼Flutter现状 闲鱼是第一个使用Flutter混合开发的大型应用,但闲鱼客户端开发最深入体会的痛点就是编译时长影响开发体验。在FlutterNative这种开发模式下,Native编译速度慢,模块开发无法突破。闲鱼集成了集团众多中间件,很…

算法通关第二十关-青铜挑战认识图结构

大家好我是苏麟 , 今天来聊聊图结构 . 我们平时在工作、学习中会大量使用图结构,不过呢在使用代码进行具体实现的时候极少使用图,主要是图里容易产生环,难以处理。 在算法里,考察图也不是很多,主要是图的表示非常复杂&…