使用presto数据库在字符数字比较中遇到的坑

1.事情的始末

公司的sql查询平台提供了HIVE和Presto两种查询引擎来查询hive中的数据,由于presto的速度较快,一般能用presto跑就不用hive跑(有的时候如果使用了hive的UDF就必须用hive了),然而昨天发生了一件血案。

有一个需求需要统计某个时间小于100000s的所有记录,这个时间存在一个map<string,string>中,然后自然想到的就是where map["stat_time"] <100000 ,结果出来的数据特别少,开始还天真的以为是数据的确就特别少。后来产品说不正常。仔细排查以后发现,这些数据都是小于10的。

相信看到这里就已经比较清晰了,这presto种字符串和数字比较,是把数字转化成字符串进行比较,也就是"10000" 和 23比,"10000" 小,由于hive和很多语言以及框架上,这种情况都是把字符串转化成数字,就没做特殊处理。结果遇到了这个坑。后来把查询引擎缓存hive就好了。

2.扩展

不过为了安全,健壮性和可读性考虑,还是应该加上一些转换函数,hive和presto中都提供了cast转换

cast(value AS type) → type
显式转换一个值的类型。 可以将varchar类型的值转为数字类型,反过来转换也可以。

try_cast(value AS type) → type
与cast类似,不过,如果转换失败会返回null,这个只有presto有

另外需要注意的是 hive中的int类型是就是int,而presto中是包装类型Integer,如果cast的type写错也会报错

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏胖胖的专栏

使用 trie 树实现简单的中文分词

导语:工作中偶尔遇到需要对中文进行分词的情况,不要求非常高的精确度和语境符合度,仅是为了统计某些词出现的热度。本文提供了一种简单易行的中文分词方法。 工作中,偶...

93950
来自专栏Python中文社区

Python如何传递运算表达式

正小歪,Python 工程师,主要负责 Web 开发和日志数据处理。博客文章《真正的 Tornado 异步非阻塞》、《使用 JWT 让你的 RESTful AP...

12110
来自专栏Web行业观察

从JSON进化到BSON

自从MEAN引导的JSON数据格式取代传统JAVA推崇的XML以后, json的发展却停滞不前了, 当然这是好事, 因为稳定的结构是不需要向下兼...

40640
来自专栏Pythonista

time模块

在Python中,通常有这三种方式来表示时间,时间戳,元组(struct_time)、格式化的时间字符串:

15320
来自专栏杨建荣的学习笔记

Python代码重构参考

在数据库方向上相对来说能够容易推出开发规范和标准,但是你很少听到公司里面出针对开发同学的开发规范。我觉得其中的一个原因是程序猿比较执拗,以技术服人,经常...

28600
来自专栏java学习

java每日一练(2017/8/24)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

398160
来自专栏量子位

干货 | 如何写一个更好的Python函数?

《Writing Idiomatic Python》一书的作者在Medium上发表了一篇文章,给出了6个建议。

11120
来自专栏北京马哥教育

让你的 Python 代码优雅又地道

学Python最简单的方法是什么?推荐阅读:Python开发工程师成长魔法 译序 如果说优雅也有缺点的话,那就是你需要艰巨的工作才能得到它,需要良好的教育才能欣...

408100
来自专栏韩伟的专栏

基于对象和面向对象

“基于对象”是“面向对象”一次动态化变迁,它依赖于现代语言的动态特性,让方法和属性统一起来;用组合取代继承;以函数对象查找取代多态的方法调用。这些变化让面向对象...

1.5K00
来自专栏韩伟的专栏

OO玩法:基于对象

“基于对象”的特点 什么是“基于”对象呢?就是关注“对象之间”的关系,而不是关注对象和类的关系。“面向对象编程”(OOP)的概念已经诞生了很多年,在业界可谓深入...

34840

扫码关注云+社区

领取腾讯云代金券