oracle sql和spark sql表达的差异
本文的创作背景
笔者是个研究生,上学期学习了各类不同的数据库和spark sql,恰好自己最近一段实习工作中,涉及到了将oracle数据库可识别的sql语句转化为spark sql语句。在完成这个工作中,进行了很多搜索,但没有专门针对将oracle数据库适用的sql语句转化为spark sql的文章。因此决定自己写一篇,能够帮到遇到类似问题的人。
本篇主要来讲oracle sql和spark sql表达的差异,之后可能会继续写相同的表达和在实际进行spark sql代码书写时常见的问题。
关于对问题实质的剖析
spark sql在学校学习的时候,似乎没有感觉到和sql有什么区别,为什么oracle数据库可以识别的sql会和sqark sql不同呢?
经过查询资料后,发现:
- 日常适用的spark sql就是和普通的标准sql一致 :目前我们用的Spark2.x 版本中遵循的是美国的ANSI的SQL2003完全标准sql ;
- 而之所以oracle数据库可识别的sql语句和spark sql有较大的区别,是因为oracle中有很多自己独特的函数和表达。换言之,夹杂着oracle特有的函数和特殊表达的sql,不是标准sql。
- 其实不同数据库,一般或多或少都有一些自己独特的函数或查询表达方式,这些差异一定程度上是简化了sql代码的书写,但是也让sql的可移植性变差了。
结论:oracle可以适用的sql转化为spark sql的核心,就是其他的不变,更改oracle数据库独有的函数或表达方式为标准sql。
需要进行的转化
一、表示表关联.
假如A、B、C、D、E是三张表
Oracle<=> spark sql
A.id=B.id <=> A inner join B on(A.id=B.id)
B.name=C.name(+) <=> B left join C on(B.name=C.name)
C.amount_id(+)=D.amount_id <=> D left join C on (D.amount_id=C.amount_id)
换言之,(+)在=左侧,则为右关联(但都要表示为右侧的表左关联左侧的表);(+)在=右侧,则为左关联;=两侧无(+),则为内关联。
另外,需要注意的是,在普通sql中,我们经常会用select* from 表A名and表B名 where 表A关联字段=表B关联字段。
而在spark sql中,我们一般用一个起始表将所有涉及的表都关联起来。
例如,oracle sql:
select* from A,b,c,d
where A.id=B.id and B.name=D.name