Igo*_*tov 6 java apache-spark apache-spark-sql
我有一个包含一个非常大的整数值的数据帧,例如:
42306810747081022358
Run Code Online (Sandbox Code Playgroud)
当我试图将它转换为长时间它在Java中工作但不在火花环境下,我得到了
NumberFormatException: For input string("42306810747081022358")
Run Code Online (Sandbox Code Playgroud)
然后我试着将它转换为十进制(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")));
Run Code Online (Sandbox Code Playgroud)
在这里,我所得到的只是一个全零的列.
我该怎么办?
小智 10
尝试:
dframe.withColumn("c_number", dframe.col("c_a").cast("decimal(38,0)"))
Run Code Online (Sandbox Code Playgroud)
一个小数具有精度和刻度值,默认情况下,精度为10和规模为0
的精确度是决定你的电话号码位数的最大数量。在您的情况下,您有超过 10 位数字,因此该数字无法转换为 10 位小数,并且您有空值。
为避免这种情况,您需要指定一个足够大的精度来表示您的数字:
dframe.withColumn("c_number", dframe.col("c_a").cast(new DecimalType(38,0)))
Run Code Online (Sandbox Code Playgroud)
注意精度最高可达38
| 归档时间: |
|
| 查看次数: |
8449 次 |
| 最近记录: |