web-dev-qa-db-ja.com

列の値を文字列から10進数に変換する方法は?

非常に大きな整数値を含むデータフレームがあります。例:

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"))); 

そしてここでも、私が得ているのはすべてゼロの列だけです。

どうすればよいですか?

8
Igor Kustov

試してみてください:

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

10進数 には精度スケールがあります値。デフォルトでは、精度は10、スケールは0です。
精度は、数値の最大桁数です。あなたの場合、10桁を超えているため、数値を10桁の10進数にキャストできず、null値があります。

これを回避するには、数値を表すのに十分な大きさの精度を指定する必要があります。

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

精度は最大38になる可能性があることに注意してください

1
Fabich

In scala:

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

これは、変換する必要のある列を持つデータフレームにデータが準備できた後です。試してみてください:dframe.select($ "column_name" .cast( "decimal(9,2)"))

0
Sesha