博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
clickhouse 条件语句内decimal除0报错处理
阅读量:2061 次
发布时间:2019-04-29

本文共 1648 字,大约阅读时间需要 5 分钟。

clickhouse decimal类型除0异常

最近使用clickhouse做一个报表页面出现一个问题。

SELECT    sum( impressions) impressions,    sum( clicks ) clicks,    if(impressions>0,clicks/impressions,0) clickRate,    sum( cost ) cost,    if(clicks>0, cost/clicks,0) clickCostFROM    amazon_ad_report_campaignGROUP BY campaign_idHAVING campaign_id in (214011130363);

出现如下报错

There is no supertype for types Decimal(38, 2), Float64 because some of them have no lossless conversion to Decimal

意思就是Decimal 和Float类型这间不能直接进行转换

在这里插入图片描述

错误原因在 if(clicks>0, cost/clicks,0) clickCost 这里

于是我单独对这个sql进行测试

select toDecimal32(0,2) as cost,toInt64(0) as clicks , if(clicks>0, cost/clicks,0) clickCost;-- Exception: Division by zero-- Decimal除零会异常

实际上按理说 上面不会执行到 cost/clicks,因此不会触发Division by zero才对。

条件运算符(如果/条件/三元)惰性计算问题

这里给出了部分解释。

目前,惰性计算仅适用于纯常量,不适用于常量表达式

如 SELECT 1 ? 0 : 1 % 0 不会执行1%0

而 SELECT 1>0 ? 0 : 1 % 0 则会执行 1%0

也就是说 如果条件函数中条件不是表达式,那么其实每个分支都会被执行,但是只是返回正确分支得数据。

NaN(非数据)和Inf(无穷)和允许除零数据

在这里插入图片描述

实际上clickhouse 有定义NaN(非数据)和Inf(无穷)两种数据,允许计算时除数为0.

select toDecimal32(0,2) as cost,toInt64(1) as clicks , if(clicks>0, cost/clicks,0) clickCost;-- 没有异常-- 0.00,1,0.00
select toFloat64(1.0)/0;-- 可以执行 值为 ∞select toInt64(1)/0;-- 可以执行 值为 ∞select toDecimal32(2,0)/0;-- 执行异常 Exception: Division by zero

测试部分数据除0,发现数字类型中Decimal会报错,其他数字类型 int,float式可以除0.

个人对decimal除0处理方案

因此对应decimal除0可以有两种处理方案(个人方案)

方案1:避免除0

select toDecimal32(0,2) as cost,toInt64(1) as clicks  ,  divide(cost,if(clicks>0,clicks,toInt64(9223372036854775807))) clickCost-- 这种将被除数设置为很大,使得出的结果接近为0

方案2:转换类型

对于计算精度要求不高的,可以将 Decimal转换为 float类型进行计算

select toDecimal32(0,2) as cost,toInt64(1) as clicks  ,       if(clicks>0,divide(toFloat64(cost),clicks),0) clickCost

转载地址:http://ezmlf.baihongyu.com/

你可能感兴趣的文章
记一次 Kubernetes 机器内核问题排查
查看>>
记一次 Kubernetes 中严重的安全问题
查看>>
在业务系统中寻找技术含量
查看>>
拥抱云原生,基于 eBPF 技术实现 Serverless 节点访问 K8S Service
查看>>
有了 Docker 就不用再深入学习 MySQL 了?
查看>>
持续监控集群中的镜像漏洞
查看>>
终于可以像使用 Docker 一样丝滑地使用 Containerd 了!
查看>>
张磊大神的《深入剖析Kubernetes》终于出书啦!
查看>>
KubeSphere 团队(青云QingCloud) 全职开源职位等你加入!
查看>>
真棒!3 种方法限制 Pod 磁盘容量,瞬间豁然开朗
查看>>
高并发、高可用、高可靠微服务架构7大顶级设计思维模型
查看>>
如何使用 registry 存储的特性
查看>>
凉了,stress 无论如何也无法打满 CPU
查看>>
除了 k8s,留给 k 和 s 中间的数字不多了!
查看>>
使用 wrk 压测并精细控制并发请求量
查看>>
Ceph 故障排查笔记 | 万字经验总结
查看>>
使用 Go 从零开始实现 CNI 可还行?
查看>>
KubeSphere 3.1.0 GA:混合多云走向边缘,让应用无处不在
查看>>
Containerd 1.5 发布:重磅支持 docker-compose!
查看>>
基于 Kubernetes 的 Spring Could 微服务 CI/CD 实践
查看>>