非常に大きな整数値を含むデータフレームがあります。例:
42306810747081022358
それをlongに変換しようとすると、Javaで動作していましたが、spark環境では動作していませんでしたが、
NumberFormatException: For input string("42306810747081022358")
次に、それもDecimal(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")));
そしてここでも、私が得ているのはすべてゼロの列だけです。
どうすればよいですか?
試してみてください:
dframe.withColumn("c_number", dframe.col("c_a").cast("decimal(38,0)"))
10進数 には精度とスケールがあります値。デフォルトでは、精度は10、スケールは0です。
精度は、数値の最大桁数です。あなたの場合、10桁を超えているため、数値を10桁の10進数にキャストできず、null値があります。
これを回避するには、数値を表すのに十分な大きさの精度を指定する必要があります。
dframe.withColumn("c_number", dframe.col("c_a").cast(new DecimalType(38,0)))
精度は最大38になる可能性があることに注意してください
In scala:
df=df.withColumn("col", $"col".cast(DecimalType(9,2)))
これは、変換する必要のある列を持つデータフレームにデータが準備できた後です。試してみてください:dframe.select($ "column_name" .cast( "decimal(9,2)"))