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

时间:2016-10-24 18:52:11

标签: java apache-spark apache-spark-sql

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

42306810747081022358

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

   NumberFormatException: For input string("42306810747081022358")

然后我尝试将它转换为十进制(BigDecimal)值。再一次,很容易在Java中完成它,但在Spark中:      dframe.withColumn(“c_number”,col(“c_a”)。cast(new DecimalType()));

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

我也尝试使用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"))); 

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

我该怎么办?

5 个答案:

答案 0 :(得分:8)

尝试:

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

答案 1 :(得分:0)

Decimal具有精度比例值,默认情况下,精度为10,比例为0。 精度是数字中的最大位数。在您的情况下,您有超过10位数字,因此该数字不能转换为10位十进制数字,并且您具有空值。

为避免您需要指定足够大的精度来表示您的数字:

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

请注意,精度最高可达38

答案 2 :(得分:0)

这是在数据框中的数据已准备好需要转换的列之后 尝试: dframe.select($“ column_name” .cast(“ decimal(9,2)”))

答案 3 :(得分:0)

在Scala中:

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

答案 4 :(得分:0)

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

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