数仓Hive Sql 迁 Spark Sql 。通过对线上任务的双跑回放比对,踩了很多坑,发现存在诸多兼容性问题。本文列举了踩过的十大坑,关于修复方案, 请参考SparkSql与HiveSql的兼容性(2)。
坑1:
join条件on中spark不支持case when语法
举例:
1 | select id, username |
spark 社区有相关issue讨论:https://issues.apache.org/jira/browse/SPARK-25961
社区评论说是有意禁止的, 不建议修复.
坑2:
模棱两可的字段
复现demo:
1 | select city_id from |
异常:
1 | org.apache.spark.sql.AnalysisException: Reference 'city_id' is ambiguous, could be: tb3.city_id, tb4.city_id.; line 2 pos 12984 |
社区有相关issue讨论:https://issues.apache.org/jira/browse/SPARK-18577
社区认为该行为只有hive支持该语法, 而mysql,presto等等引擎都不支持这种模棱两可的语法行为, 所以spark不做修复.
坑3:
unix_timestamp函数差异性
spark和hive对时间格式约束不同: 对24点spark认为是非法的.
1 |
|
坑4:
to_date函数差异性
对特殊值的处理存在差异:
hive查询结果:
1 | hive> select to_date('0000-00-00'); |
而spark结果为null
1 | spark-sql> select to_date('0000-00-00'); |
坑
order by 排序差异性
目前发现受影响的主要是开窗函数有:row_number,fist_value,last_value等等
根因:hive对某列相同值排序后会发生倒序, 复现demo如下:
1 | create table test_sort(c1 int, c2 int); |
而spark查询均正常:
1 | spark-sql> select * from test_sort; |
坑6:
unix_timestamp与date_sub组合使用时的差异性
spark查询异常:
select unix_timestamp(date_sub(‘2020-04-06’, 30), ‘yyyy-mm-dd’);
1 | --正确(预期结果 2020-03-07 ) |
hive查询结果正常:
1 | --正确(预期结果 2020-03-07 ) |
坑7:
datediff 函数差异性
对特殊值,datediff处理不同:
select datediff(CURRENT_DATE, ‘0000-00-00’);
Spark结果为NULL
1 | spark-sql> select datediff(CURRENT_DATE, '0000-00-00'); |
Hive结果为数值:
1 | hive> select datediff(CURRENT_DATE, '0000-00-00'); |
坑8:
collect_set函数差异性
复现demo:
1 | drop table if exists test_collect_set; |
spark结果顺序和hive不同:
1 | spark-sql> |
坑9
get_json_object函数语法差异性
spark 中获取json数组的某个元素时,语法为 $[0]
而 hive 语法为 $.[0]
1 | -- 区别是差一个点; spark下面sql为null, hive有值 |
坑10
精度差异
spark在写入decimal字段数据时, 并不会四舍五入; 而hive会四舍五入.
举例: -0.0761685 spark写入为 -0.076168 ;而hive写入为 -0.076169
(未完待更…)
本文链接: https://stefanxiepj.github.io/archives/bbca4555.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!