业务场景:
1.使用spark建立数据pipeline,保存数据有float,业务需要4为小数,类型为float
问题描述:
hive表中数据类型为float
1.hive表中float类型数据在spark中计算中精度缺失;
2.通过sqoop导出数据到sqlserver,hive中显示4为小数或科学记数法,sqlserver中显示科学记数法或者15为小数(使用hive on Spark 显示时有相同问题)
此处省略一万字。。。。。。
解决方案
1. 使用spark或hive处理完hive中处理完数据后,将保留小数后的数值转换为string类型(推荐),sqlserver中正常使用float类型
2. 使用hive处理完数据保存为decimal(m,n)类型
注意: 使用spark处理数据转为deciaml, 在spark2.3.2中需要设置(解决精度确实问题)
spark.sql.decimalOperations.allowPrecisionLoss false (default:true)
3. sqlserver中float数据类型改为decimal(m,n)
4.hive或者spark中处理完数据后不用管,正常保留4为小数,sqlserver中数据用竞速确实或者科学记数法显示,让业务自己处理(如果业务坚持在hive表中使用Float类型)
尝试方法:
1.hive中使用Double: 无法解决hive on spark中像是15为小数问题,且sqlserver总小数为15位。
2.hive中使用decimal:需要提前定义decimal字段,即手动建表:无法满足自动建表的要求,且hive中类型非float,既然和业务要求不一致,不如使用string。