IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查 -> 正文阅读

[大数据]SET DECIMAL_V2=FALSE及UDF ERROR: Cannot divide decimal by zero及Incompatible return types DECIMAL问题排查

概述

最近在全职负责一款数据产品的升级改造。因旧版平台的代码写得太乱,简直惨不忍睹;别说增加功能,已有问题的定位与修复都无从下手。用户提交的,在旧版平台能执行的SQL语句,在新版平台执行报错。

此为背景。

UDF ERROR: Cannot divide decimal by zero

报错信息如下:java.lang.RuntimeException: UDF ERROR: Cannot divide decimal by zero\n,问题很明显,就是select查询语句里面含有/符号,并且分母为0。

这个报错,在不同的数据集任务,即至少两个SQL中都有出现;且在旧版平台都是执行成功的。

Impala数据源

报错的SQL精简如下:

select name as 城市
,dt as 日期
,sum(price_11) as 补单已支付金额
,sum(price_10)  as 补单未支付金额
,sum(price_11)/(sum(price_11) + sum(price_10)) as 补单回款率
from t group by name, dt

报错SQL是impala数据源:
在这里插入图片描述
在公司内部搭建可视化查询平台执行成功,执行结果截图
在这里插入图片描述

kudu数据源

另有SQL,相同的报错:

select c.*, c.cost/youe_count as cpcredit,
c.cost/all_youe_count as cpallcredit, c.cost/all_youe_amount as fyl
from b left join c on b.touch_date = c.dt

其数据源为:
在这里插入图片描述
在可视化查询平台执行失败。
在这里插入图片描述
经过排查,和使用的hive-jdbc依赖组件无关。旧版平台使用的hive-jdbc版本为:

<dependency>
	<groupId>org.apache.hive</groupId>
	<artifactId>hive-jdbc</artifactId>
	<version>1.1.0-cdh5.7.1</version>
</dependency>

新版平台使用的hive-jdbc版本为:

<dependency>
	<groupId>org.apache.hive</groupId>
	<artifactId>hive-jdbc</artifactId>
	<version>2.1.1-cdh6.2.1</version>
</dependency>

而是在提交hive类SQL(impala和kudu都是基于hive)之前未执行语句:SET DECIMAL_V2=FALSE
解决方法:

// 解决换新集群select 1/0  报错
if ("org.apache.hive.jdbc.HiveDriver".equals(driver)) {
    ps.executeUpdate("SET DECIMAL_V2=FALSE");
}

RuntimeException: AnalysisException: Incompatible return types ‘DECIMAL(38,15)’ and ‘DECIMAL(38,4)’ of exprs ‘’ and ‘’

另有一个SQL报错信息:

java.lang.RuntimeException: AnalysisException: Incompatible return types 'DECIMAL(38,15)' and 'DECIMAL(38,4)' of exprs 'edw.insure_policy.commission_rate' and 'project_b.insure_policy_test.commission_rate'.\n"

报错SQL如下:

select * from edw_bx.insure_policy union all select * from project_b.insure_policy_test

UDF ERROR: Decimal expression overflowed

报错SQL简化如下:

select 
to_date(now()) as batchId
,cast(gmv as decimal(38, 5)) as gmv
from xyg.wf_counter_MRR_month_220517_01 a 
where a.mon = '2022-04';

同样的问题

SET DECIMAL_V2=FALSE

参考DECIMAL_V2 Query Option

A query option that changes behavior related to the DECIMAL data type.
Important:
This query option is currently unsupported. Its precise behavior is currently undefined and might change in the future.
Type: Boolean; recognized values are 1 and 0, or true and false; any other value interpreted as false
Default: false (shown as 0 in output of SET statement)

参考

Query Options for the SET Statement
DECIMAL_V2 Query Option
CDH6中Impala3报错UDF ERROR: String to Decimal parse failed
impala-cast-as-decimal-errors-out-for-null-values
https://blog.csdn.net/skyyws/article/details/109647376

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:40:05  更:2022-06-14 22:42:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:22:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码