当前位置: 首页 > 知识库问答 >
问题:

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

洪昊然
2023-03-14

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

42306810747081022358

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

   NumberFormatException: For input string("42306810747081022358")

然后我尝试将其转换为十进制(BigDecimal)值。同样,可以很容易地在Java中完成,但在Spark:dframe中。带列(“c\U编号”,列(“c\U a”)。cast(新的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"))); 

这里我得到的是一个全为零的列。

我应该如何继续?

共有3个答案

于鸿博
2023-03-14

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

import org.apache.spark.sql.types.DecimalType
val convertedDf = dframe.withColumn("c_number",trim(col("c_a")).cast(DecimalType(20,0)))
杜轩昂
2023-03-14

十进制具有精度和小数位数值,默认情况下,精度为10,小数位数为0
精度是数字中的最大位数。在您的情况下,您有10个以上的数字,因此数字不能转换为10位小数,并且您有空值。

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

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

注意精度可达38

程禄
2023-03-14

尝试:

dframe.withColumn("c_number", dframe.col("c_a").cast("decimal(38,0)"))
 类似资料:
  • 问题内容: 我编写了一个简单的程序,用于在Java中向串行端口发送和接收数据。我通过回送测试(Rx到Tx)连接串行端口设备。它工作正常。但我无法发送和接收十六进制数据到串行端口和接收串行端口。在我的设备中使用了FT232BL芯片,因此是否需要任何dll或其他库来将十六进制数据发送和接收到串行端口设备。我的代码如下。 问题答案: 十六进制: 十六进制为:

  • 问题内容: 我想将二进制字符串转换为数字Eg 这怎么可能?谢谢 问题答案: 该函数将字符串转换为数字,并使用第二个参数来指定字符串表示形式的基数: 看到它在行动 。

  • 问题内容: 我想将一个整数(将为<= 255)用于十六进制字符串表示形式 例如:我想通过并离开,或获得。 我曾尝试使用65来执行此操作,但由于它想采用单个字符串,因此上述内容均会阻塞。 问题答案: 您正在寻找功能。 您似乎在混合使用整数的十进制表示形式和整数的十六进制表示形式,因此尚不清楚您需要什么。根据您的描述,我认为这些片段之一显示了您想要的内容。 请注意,这与 包含整数(十六进制)的字符串

  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案:

  • 问题内容: 要将String转换为十六进制,我正在使用: 在此处投票最高的答案中对此进行了概述:在Java中将 字符串转换为十六进制 我该如何反向执行,即将十六进制转换为字符串? 问题答案: 您可以从转换后的字符串中进行重构,这是一种实现方法: 另一种方法是使用,从包: 单元测试以验证: 注:领先剥离的仅仅是必要的,因为的你的填充方法。如果您不介意将其替换为简单的,则可以将此行放在:

  • 问题内容: 我有一个String数组。我想将其转换为字节数组。我使用Java程序。例如: 转换成: 我能做什么? 问题答案: 看一下样本,我想您的意思是字符串数组实际上是字节的十六进制表示形式的数组,不是吗? 如果是,那么对于每个字符串项,我将执行以下操作: 检查字符串是否仅包含2个字符 这些字符的间隔为‘0’..‘9’或’a’..’f’(还要考虑其大小写) 将每个字符转换为相应的数字,减去代码值