hive map 转string_Hive迁移Presto在OPPO的实践

cafd3e7455685b5ade6d5e9b7c2d208b.png

"

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

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

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

                          by:数据中台团队

                                                                                       "

presto兼容hive,总的来说需要解决如下几点问题8d0a125ee196790ec80189a3c4db7cc6.gif

1. hive的udf;

2. hive视图;

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

要完全解决这些问题无疑是费时费力,所以我们在presto和hive之上构建一层路由层--功能是将查询请求优先提交到presto中查询。若执行错误,则路由到hive中。 当然还是存在一定风险,因为由于语义处理上的不同,相同的sql在presto和hive中可能会得到不同的结果。

9c3f500841adc2b3ea641238638d5694.gif

1

语义上的修改

Part 1

Key not present in map

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

3c5daf913069b8239a951ac71a460c61.png

Part 2

Cast as string

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

8c7dabfbe2286c81f4ba7f139ffc1f57.gif

Part 3 类型隐式转换

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

1eeaf7629906e79fff9d3b50a87a37e6.png

9dd8a6b52eae81c7ac8e663351658d09.png

就能支持如下case:

1ba1390284265bbc1023f78501dd7d91.png

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

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

3f3bae5aa0e1340b970db10360627262.gif

2

hive视图兼容

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

b0c17000984bc01f15c0f42d4db19e98.png

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

05c1fbabaa9dbb1533111fda91e448d7.gif

3

团队有话说

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标准的重要性。

99945f7092d7ad0941d7cbf1c0668195.gif

投稿 | 数据中台团队

编辑 | sea

排版 | sea

往期精彩资讯

大数据时代,列式优化或许能给我们新的思考Hive转MR过程--初窥&优化探索 5584a5bdaf785afef9be09c8492bae28.gif

5c3de8f10176aec78bc07fb1117565b7.png

026e0d9267b0d8adac764512da0a9d8b.gif

”在看“点一下 大家都知道 313c40527960d3fc436559f622a2052f.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值