SparkR写入JSON时关闭科学计数法的技术求助
解决SparkR写入JSON时timestamp字段以科学计数法显示的问题
这个问题我之前帮同事排查过,核心原因是你的timestamp字段类型是double——虽然SparkR的head()方法会把整数值的double友好地显示成整数,但Spark的JSON序列化器在处理大数值double时,默认会触发科学计数法格式,这就导致了你看到的1.4262E12这种输出。
最优解决方案:将double类型转换为long类型
既然timestamp本质是整数型的时间戳,直接把字段类型转成long(长整数)是最合理的做法,这样Spark写入JSON时会直接输出纯整数格式,不会出现科学计数法。
代码实现如下:
# 先把double类型的timestamp转换为long类型 sdf <- SparkR::withColumn(sdf, "timestamp", SparkR::cast(sdf$timestamp, "long")) # 确认类型转换成功(可选) SparkR::printSchema(sdf) # 此时schema里的timestamp应该变成:|-- timestamp: long (nullable = true) # 再执行写入操作 SparkR::write.json(sdf, path=somePath, mode="append")
备选方案:保留double类型但转成字符串输出(不推荐)
如果因为业务限制必须保留double类型,你可以通过自定义UDF把double值转换成字符串形式的整数,再写入JSON。不过这种方法会把字段类型改成string,后续处理可能会有麻烦,所以仅作为应急方案:
# 定义UDF:把double转成整数格式的字符串 doubleToIntString <- SparkR::udf(function(timestampVal) { if (!is.na(timestampVal)) { as.character(as.integer(timestampVal)) } else { NULL } }, returnType = "string") # 替换原timestamp字段 sdf <- SparkR::withColumn(sdf, "timestamp", doubleToIntString(sdf$timestamp)) # 写入JSON SparkR::write.json(sdf, path=somePath, mode="append")
验证方法
转换完成后,你可以用SparkR::head(sdf)或者SparkR::printSchema(sdf)确认字段类型和数值格式,再执行写入操作,就能得到你想要的1426256000000这种长整数形式的timestamp了。
内容的提问来源于stack exchange,提问作者fletchr
相关产品推荐
相关产品推荐

