SparkSQL踩坑
在开发中,遇到了一个奇怪的Join结果。简化之后的模型如下,目测执行的结果第一个为true
,第二个为false
,而实际的结果却是两个True。
1 | create or replace temp view test1 as |
究其原因是在不同类型的比较中,Spark会把其先转为Double类型再进行比较,而Double类型的精度有限,这样就会出现让人匪夷所思的现象。在实际复杂的Join中,往往会忽视数据类型的检查。
所以在实际开发中,一定要保证join两边的数据类型一致,特别是join条件两边存在表达式的情况,例如:
1 | from tableA |
建议写成:
1 | from tableA |
在有表达式的地方,加上类型转换。
如果能在建表之初,根据业务含义和开发规范合适的选择字段的类型,则可以在很大程度上避免这类情况的发生。
比如xxx_ID 统一使用Decimal(位数,0)
,xxFlag统一使用Boolean
等,而不是String和这类情况混用。