2016-10-24 20 views
4

私は本当に大きな整数値、例が含まれデータフレーム抱えている:列値を文字列から小数点に変換するにはどうすればよいですか?

42306810747081022358 

私はそれがなく、スパークenvrironment下のJavaで働いていたロングに変換しようとした、私がいました

NumberFormatException: For input string("42306810747081022358") 

を取得してそれから私はあまりにも進(BigDecimalの)値に変換しようとしました。繰り返しても、Javaでは簡単に実行できますが、Sparkでは dframe.withColumn( "c_number"、col( "c_a"))キャスト(新しいDecimalType()));

このようにしても例外はありませんが、すべての結果値がnullであることがわかります。ここ

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

そして再び、私は取得していますすべてがすべてゼロで列があるが:

は、私はまた、この目的のためにUDFを使用しますが、同じ結果を取得しようとしました。

どうすればよいですか?

答えて

4

試行:

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

Decimalは、デフォルトでは精度が10とスケールで、精度スケール値を有する0
精度が電話番号の数字の最大数であります。あなたのケースでは10桁以上の数字があるので、数字は10桁の10進数にキャストできず、あなたはNULL値を持っています。精度は最大38

できること

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

注意:あなたがあなたの数を表すのに十分な大きさの精度を指定する必要があることを回避するために

関連する問題