记录oracle转sparksql的问题
2018-03-29 17:35
204 查看
oracle转sparksql中遇到某些函数转换问题
1.listagg行转列函数
LISTAGG(Item_Category_Name ‘,’) WITHIN
GROUP(ORDER BY Item_Category_Name)//oracle
经过多方查询:
使用
CONCAT_WS(“,collect_set(Item_Category_Name)) over (oder by Item_Category_Name);//sparksql
2.regexp_substr(b.orgcode,’[^.]+’,1,2) 部门组
3010100.50320.1665.112
此函数为正则取部门编号即50320.
用sparksql替换为
regexp_extract(b.orgcode,’(\\d+)\\.(\\d+)\\.(\\d+).\\(\\d+)’,2)
取第二个匹配括号的值
3.select * from (select * from abc )
此处需要注意,必须要给from后嵌套的selelct子句外侧加一个表别名。
即select * from (select * from abc ) b,不然sparksql会报错
4.with as等创建临时表的操作一般采用中间registerTemptable来进行,不用with as的语法。
5.对于Oracle存过中sql过长的情况一般采用拆分的方式来进行,以免spark解析器无法解析sql报错。
6.对于row_number()over (partion by ““ )这种函数,容易报错无法获取内存资源,需要在代码开头加一段参数配置如
下:val sc=new SparkContext(conf)
val sqlContext=new HiveContext(sc)
sqlContext.setConf(“spark.sql.tungsten.enabled”,”ture”)
7.sparksql 不支持oracle中update、delete关于多行数据的操作。一般来说用writeparquet进行落地,中间表用registerTemptable进行注册临时表来处理。这里说一下对于落地的表需要加载到已经建好的表中,属于overwrite的操作,所以一般对于增量层采用直接落地(有效期一般是一天左右),全量层数据一般用增量数据和以往全量进行union操作,实际上也是一个update的操作。中间表一定需要droptemptable
8.对于监控日志等需要做逐条插入的操作,sparksql可以使用
insert into table abc_cvt_injust select
变量1,变量2,变量3;
如以上语法可以满足逐条插入的需求。
一般用于多个sql进行日志监控,用一张表存放日志信息。
相关文章推荐
- 基于SPARK SQL 读写ORACLE 的简单案例分析常见问题
- Oracle 存储过程部署时sqlplus无响应问题记录
- Oracle自动导入数据文件(类似bcp的功能)及问题记录SQL*LOADER-704,ORA-12504
- 使用PL/SQL Developer连接远程oracle客户端报错问题解决记录
- spark-sql访问hive的问题记录
- Oracle使用超大SQL脚本文件恢复数据问题记录
- 【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题
- 失败的sparkSql使用问题记录
- 基于Spark SQL 读写Oracle 的简单案例分析常见问题
- Oracle中查询并删除重复记录的SQL语句详解
- 神奇的问题记录【SqlDataAdapter Fill DataSet】
- oracle的sql到Sybase数据库遇到的一些sql区别,偶然遇见的office报错修复问题
- oracle的SQL语句执行效率问题查找与解决方法
- windows7 下安装64位oracle用PL/SQL Developer连接报错问题
- 32位Ubuntu 12.04 安装Oracle 11g问题记录
- spark运维问题记录
- SQL问题记录——Unable to connect SqlServer "Oledb ...
- 配置linux下oracle sqlplus/rman等历史记录回调功能
- Oracle 查询并删除重复记录的SQL语句
- Spark开发问题记录