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

Java 如何将列值从字符串转换为十进制?,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,我有一个数据帧,其中包含一个非常大的整数值,例如: 42306810747081022358 当我尝试将它转换为long时,它在Java中工作,但不是在spark环境下,我得到了 NumberFormatException: For input string("42306810747081022358") 然后我试着把它转换成十进制值。同样,在Java中也可以轻松实现,但在Spark中: 带有列C_编号的数据帧,列C_a.castnew DecimalType 这样我就不会得到任何异常

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

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

   NumberFormatException: For input string("42306810747081022358")
然后我试着把它转换成十进制值。同样,在Java中也可以轻松实现,但在Spark中: 带有列C_编号的数据帧,列C_a.castnew 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"))); 
这里我得到的是一个全为零的列

我应该如何继续?

试试:

dframe.withColumn("c_number", dframe.col("c_a").cast("decimal(38,0)"))
A具有精度和比例值,默认情况下,精度为10,比例为0。 精度是数字中的最大位数。在您的情况下,您有超过10位数字,因此数字不能转换为10位小数,并且您有空值

为避免需要指定足够大的精度来表示数字,请执行以下操作:

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

请注意,精度可高达38

这是在数据帧中的数据准备就绪后,需要转换的列 尝试: 在scala中选择$column\u name.castdecimal9,2

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

在scala spark中,您可以使用DecimalType进行转换:

import org.apache.spark.sql.types.DecimalType
val convertedDf = dframe.withColumn("c_number",trim(col("c_a")).cast(DecimalType(20,0)))

只有代码的答案很少有帮助。请详细说明您的代码,并解释为什么以及如何解决这个问题。