您的位置:首页 > 数据库 > Oracle

记录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进行日志监控,用一张表存放日志信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: