【问题标题】:How to convert column values from string to decimal?如何将列值从字符串转换为十进制?
【发布时间】:2016-10-24 18:52:11
【问题描述】:

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

42306810747081022358

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

   NumberFormatException: For input string("42306810747081022358")

然后我也尝试将它转换为十进制(BigDecimal)值。同样,在 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"))); 

在这里,我再次得到的是一个全为零的列。

我应该如何进行?

【问题讨论】:

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


    【解决方案1】:

    试试:

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

    【讨论】:

      【解决方案2】:

      Decimal 有一个 precisionscale 值,默认情况下精度为 10,比例为 0。
      精度是您的号码中的最大位数。在您的情况下,您的数字超过 10 位,因此无法将数字转换为 10 位 Decimal 并且您有空值。

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

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

      注意精度最高可达38

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            在斯卡拉中:

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

            【讨论】:

            • 仅代码的答案很少有帮助。请详细说明您的代码并解释为什么以及如何解决问题。
            猜你喜欢
            • 2015-02-06
            • 2012-02-03
            • 2013-02-07
            • 1970-01-01
            • 2017-06-16
            • 1970-01-01
            • 2011-08-25
            • 2014-04-28
            • 2020-03-14
            相关资源
            最近更新 更多