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

ycl3bljg  于 2021-05-27  发布在  Spark
关注(0)|答案(4)|浏览(473)

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

42306810747081022358

当我尝试将它转换为long时,它在java中工作,但不是在spark环境下,我得到了

NumberFormatException: For input string("42306810747081022358")

然后我试着把它转换成十进制(bigdecimal)值。同样,在java中也很容易做到,但是在spark:dframe.withcolumn(“c\u number”,col(“c\u a”).cast(new decimaltype());
这样我就不会得到任何异常,但是我可以看到所有的结果值都是空的。
为此,我也尝试使用自定义项,但得到了相同的结果:

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")));

在这里我得到的是一个全为零的列。
我该怎么办?

tct7dpnv

tct7dpnv1#

在scala中:

df=df.withColumn("col", $"col".cast(DecimalType(9,2)))
taor4pac

taor4pac2#

小数点具有精度和小数位数值,默认情况下,精度为10,小数位数为0。
精度是数字中的最大位数。在您的情况下,您有10个以上的数字,因此数字不能转换为10位小数,并且您有空值。
为避免需要指定足够大的精度来表示数字:

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

请注意,精度可高达38

hec6srdp

hec6srdp3#

尝试:

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

wpcxdonn4#

这是在您的数据框中有需要转换的列的数据后,请尝试:dframe.select($“column\u name”.cast(“decimal(9,2)”)

相关问题