Oracle存储过程向Hadoop迁移中的问题及方案
本文记录Oracle存储过程向Hadoop迁移中遇到的问题及响应的解决办法,作为初学者,文中内容有不妥之处欢迎指正,
1、不支持IN中的子查询,
Solution,使用INNER JOIN将子查询操作添加到WHERE子句之前,
2、因脚本中同时使用hive(即HQL)语句和SQL语句,注释不能混用,
Solution,脚本的hive语句中的注释中应该是“#”,子句中不能出现“--”,否则会使脚本运行出现执行异常;同时注意/**/注释的使用,
3、脚本中语句末尾是否需要标点需要严格检查,
Solution,根据语法判断,对比前后语句的格式是否一致,
4、脚本中不要出现英文分号,因为hive会认为英文分号为语句结束符,英文分号之后的语句会被认为新的执行语句,即便是在注释中,
5、平台搭建时设置了set hive.groupby.skewindata=true;解决数据平衡问题,但执行中出现“DISTINCT on different columns not supported with skew in data”问题,
Solution,DISTINCT问题,删除hive语句中配置的“set hive.groupby.skewindata=true;”
6、hive语句中不支持NULLIF,
Solution,NULLIF(t1, '**') 可以用下面的语句替换
if(t1= '**',null,t1)
7、hive语句中不支持DECODE
DECODE(A,'1','1','2','2','0') 可转换为
CASE WHEN A = '1' THEN '1' WHEN A = '2' THEN '2' ELSE '0' END
8、只报空指针错误,
Solution,可先不查询数据结果,先列表检查最终检索字段,各个需要UNION ALL拼接结果的字段是否一致;拼接字段一致,仍报空指针时可查询数据进一步检查,
当SELECT查询的列的字段名相同时会报“字段名歧义”错误,应同时为两个字段添加别名,
所以团队联合开发脚本前最好约定好一些通用规范,比如,脚本中针对hive语句和SQL语句如何使用注释,规范SQL语句格式(保留字的大小写问题),等等,