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进行日志监控,用一张表存放日志信息。
9.对于需要insert into 的表,去掉该语法,直接select ,然后将select的df 写成parquet,然后再利用load 加载入hive表中,使用overwrite的方式,其中如果出现落地以后,select中出现多个相同字段,请给该列加一个别名,别名参考具体插入的目标表该列别名,否则写入parquet会报错出现相同列的问题,
10.对于oracle11g中出现unpivot的语法,可以使用
原本: