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

新手上路,请多包涵

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

 42306810747081022358

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

   NumberFormatException: For input string("42306810747081022358")

然后我尝试将它转换为 Decimal (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")));

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

我该如何进行?

原文由 Igor Kustov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 297
2 个回答

尝试:

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

原文由 user6022341 发布,翻译遵循 CC BY-SA 3.0 许可协议

Decimal 具有 精度比例 值,默认情况下精度为 10,比例为 0。

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

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

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

注意精度可以达到38

原文由 Fabich 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题