本文来自OPPO互联网技术团队,如需要转载,请注明出处及作者。欢迎关注我们的公众号:OPPO_tech

hive设计之初,就被定位一款离线数仓产品,虽然Hortonworks喊出了Make Apache Hive 100x Faster的牛逼口号,也在上面做了大量的优化,然而性能提升依旧不大。

而随着OPPO数据量一步步的增多,动辄运行几个小时的hive再也满足不了交互查询的需求,因此我们引入了presto,sql on hadoop阵营里的优秀代表。主要适用于即席查询。

然而事情往往木有那么简单,很多分析师用惯了hql,迁移的成本很大,所以本着业务方都是美丽的上帝的原则。为了使用户能平滑的将业务迁移到presto上,我们义无反顾跳入了presto兼容hive这个大坑中,接下来介绍下我们主要兼容工作。

presto兼容hive,总的来说需要解决如下几点问题:

  1. hive的udf;
  2. hive视图;
  3. 语义处理上的不同,如presto中1/2=0, hive中为0.5。

要完全解决这些问题无疑是费时费力,所以我们在presto和hive之上构建一层路由层--功能是将查询请求优先提交到presto中查询。若执行错误,则路由到hive中。

当然还是存在一定风险,因为由于语义处理上的不同,相同的sql在presto和hive中可能会得到不同的结果。

语义上的修改

Part 1: Key not present in map

presto处理map,若key不存在,会报错,而hive会返回null。

Part 2: Cast as string

由于presto中并没有名为string的类型,出现若进行cast as string这样的转换,或者表定义中有string类型会出现Unknown type 的错误。因此我们在ASTBuilder.java中把string替换为了varchar类型(实现了对sql语法树的转换)

Part 3: 类型隐式转换

迁移过程中,在presto中经常会出现类型不匹配的错误。核心原因就是hive会对数据类型做兼容性转换。一开始考虑对运算符进行重载,如添加以下函数:

就能支持如下case:

然而这种方式需要对+,- ,* ,/ ,between ,in 等几乎所有的运算符进行重载,太繁琐了。

因此我们换了一种思路:即隐式的插入一个CAST。相当于把 select 1 = '1' 转换成了 select 1 = cast('1' as int),从而在sql编译的前端实现了转换,兼容性上不会有任何问题。

hive视图兼容

presto和hive语义不同,自然hive定义的视图presto不能访问,但对一些简单的视图定义,如:

我们可以提供支持,方法也很简单:即在presto读取视图定义(StatementAnalyzer.java)的时候,解析原始的sql定义的语句,转换成presto的视图结构。

总结

  1. 对于业务开发的一些udf函数的支持;
  2. 对map结构的解析,比如map数据"{fk_1=1,fk_2:2,fk_3:3}",在hive 1.x 中使用"colelction.delim"作为值之间的分割符;而 hive 3.x 用"collection.delim" ;Prestosql 315则依赖于 hive 3.x,导致对线上的hive 1.x中的map数据解析出现问题。

当然presto对于hive的兼容工作远不止这些,udtf,hive对null处理等等,涉及到方方面面的细节,这也凸显了统一的sql标准的重要性。

最后,重点来啦:

OPPO互联网运维云存储团队急招多个岗位,欢迎对MongoDB内核源码、Wiredtiger存储引擎、RocksDB存储引擎、数据库机房多活、数据链路同步系统、中间件、数据库等有兴趣的同学加入,一起参与OPPO百万级高并发文档数据库研发。

工作地点:深圳 / 成都

联系邮箱:yangyazhou@oppo.com

hive sql 报错后继续执行_Hive迁移Presto的技术实践相关推荐

  1. hive sql 报错后继续执行_Hive迁移Presto在OPPO的实践

    " hive设计之初,就被定位一款离线数仓产品,虽然Hortonworks喊出了Make Apache Hive 100x Faster的牛逼口号,也在上面做了大量的优化,然而性能提升依旧不 ...

  2. hive sql 报错后继续执行_Hive优化之Spark执行引擎参数调优(二)

    Hive是大数据领域常用的组件之一,主要是大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的的一个点,因此掌握一些Hive调优是必不可少的一项技能.影响Hive效率的主要有数据 ...

  3. hive sql 报错后继续执行_Hive 执行sql命令报错

    Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxExce ...

  4. DB2 sql报错后查证原因与解决问题的方法

    DB2 sql报错后查证原因与解决问题的方法 参考文章: (1)DB2 sql报错后查证原因与解决问题的方法 (2)https://www.cnblogs.com/BradMiller/p/31978 ...

  5. 记录hive sql报错,return code1和return code2解决方法

    执行hive sql语句的时候非常容易出现return code 1.return code 2.return code 3的情况,我就遇到了很多次,code3在某次意外中得以解决 但是引发了code ...

  6. hive sql报错:SQL 错误 [10004] [42000]: Error while compiling statement: FAILED: SemanticException [Error

    SQL 错误 [10004] [42000]: Error while compiling statement: FAILED: SemanticException [Error 10004]: Li ...

  7. 关于执行SQL报错:java.lang.ArrayIndexOutOfBoundsException: 6

    关于执行SQL报错:java.lang.ArrayIndexOutOfBoundsException: 6 由于工作需要,需创建一个表C,表数据由表A left join 表B生成,表A数据量大概30 ...

  8. 数据库执行sql报错Got a packet bigger than 'max_allowed_packet' bytes及重启mysql

    准备在mysql上使用数据库A,但mysql5经过重装后,上面的数据库已丢失,只得通过之前备份的A.sql重新生成数据库A. 1.执行sql报错 在执行A.sql的过程中,出现如下错误:Got a p ...

  9. Windows Server 2008 安装 SQL Server 2008 报错:试图执行未经授权的操作

    今天在安装SQL Server 2008的时候报错:试图执行未经授权的操作 然后在网上找了很多解决办法: 给setup.exe可执行文件的USER用户添加完全控制权限 取消setup.exe可执行文件 ...

最新文章

  1. Extensible Messaging and Presence Protocol (XMPP): Core
  2. CodeIgniter自带的数据库类使用介绍
  3. 请不要做浮躁的人——转给即将上路或者正在路上的程序员朋友
  4. PB_Truncate函数截取小数点引起的数字错误
  5. Ubuntu16.04在线安装MongoDB详细教程
  6. C#中调用halcon引擎来执行hdev程序
  7. Linux系统日常维护命令
  8. html换行添加前缀,为什么使用css3要加前缀?
  9. 【蓝桥杯】历届试题 分糖果
  10. 扫地机器人水箱背景_家友扫地机器人拖地水箱配件(米家扫地机器人1代版)体验(Case Closed)...
  11. linux操作系统关闭防火墙,linux操作系统关闭防火墙的方法
  12. ember controller内调用save修改model数据时出现null的解决方案
  13. iOS 性能优化那些繁杂琐碎的事儿
  14. phoenix-hbase 服务频繁挂掉问题排查
  15. 初级第三旬05— 初级班课程第三旬试题
  16. Day11:麦卡锡91函数(McCarthy 91)
  17. 常用的空间数据结构(网格/四叉树/八叉树/BSP树/k-d树/BVH/自定义划分)
  18. github访问不了怎么办
  19. hive------内部函数与自定义函数
  20. 【skywalking 部署测试】

热门文章

  1. 关于ftp的说法错误的是_斯坦福教授:成长型思维的养成,只需要换个说法,思维是可以训练的!...
  2. k8s 集群 Ingress Nginx传递用户真实IP问题
  3. 服务器安全性文档,Microsoft Web服务器的安全性
  4. android studio 多dex,AndroidStudio利用android-support-multidex解决64k的各种异常
  5. python多项式回归_Python 多项式回归 - 树懒学堂
  6. python中的队列和栈_python的队列和栈
  7. python opencv 人脸比对_Python3.5+openCv在Windows下利用LBP算法进行人脸识别并匹配
  8. grub2引导linux内核,一种基于grub2的linux系统启动bootloader的制作方法与流程
  9. python encodings模块_ImportError:没有名为'encodings'的模块
  10. 字符串转bigdecimal类型_BigDecimal你会用吗?