如何将列值从字符串转换为十进制?

2022-09-03 18:00:45

我有一个包含非常大的整数值的数据帧,例如:

42306810747081022358

当我试图将它转换为长时,它在Java中工作,但不是在火花环境下,我得到了

   NumberFormatException: For input string("42306810747081022358")

然后我尝试将其转换为十进制(大十进制)值。同样,在Java中可以很容易地做到这一点,但是在Spark中:dframe.withColumn(“c_number”,col(“c_a”).cast(new DecimalType()));

这样我就不会得到任何异常,但是我可以看到所有结果值都是空的。

我也尝试使用UDF来实现此目的,但得到了相同的结果:

UDF1 cTransformer = new UDF1<String, BigDecimal>() {
        @Override
        public BigDecimal call(String aString) throws Exception {
            return new BigDecimal(aString);
        }
    };
sqlContext.udf().register("cTransformer", cTransformer, new DecimalType());
dframe = dframe.withColumn("c_number", callUDF("cTransformer", dframe.col("c_a"))); 

在这里,我得到的只是一个全零的列。

我应该如何继续?


答案 1

尝试:

dframe.withColumn("c_number", dframe.col("c_a").cast("decimal(38,0)"))

答案 2

小数点具有精度小数位数值,默认情况下精度为 10,小数位数为 0。
精度是数字中的最大位数。在你的情况下,你有超过10位数字,所以这个数字不能被强制转换为10位十进制,并且你有空值。

为了避免这种情况,您需要指定一个足够大的精度来表示您的数字:

dframe.withColumn("c_number", dframe.col("c_a").cast(new DecimalType(38,0)))

请注意,精度最高可达 38


推荐