1. ホーム
  2. scala

[解決済み] スパークSPLラウンド&ブラウンド

2022-02-07 23:56:31

質問

スパークSPLでラウンドとブラウンドがどのように動作しているのか混乱しています。

scala> spark.sql("select round(1.5, 0), bround(1.5, 0)").show()
+-------------+--------------+
|round(1.5, 0)|bround(1.5, 0)|
+-------------+--------------+
|            2|             2|
+-------------+--------------+


scala> spark.sql("select round(2.5, 0), bround(2.5, 0)").show()
+-------------+--------------+
|round(2.5, 0)|bround(2.5, 0)|
+-------------+--------------+
|            3|             2|
+-------------+--------------+


scala> spark.sql("select round(3.5, 0), bround(3.5, 0)").show()
+-------------+--------------+
|round(3.5, 0)|bround(3.5, 0)|
+-------------+--------------+
|            4|             4|
+-------------+--------------+

解決方法は?

  1. 丸い

文字どおりの「最近接値」に丸めるモードです。 ただし、両隣が等距離の場合は切り上げとなります。 のように動作します。 RoundingMode.UP の場合、捨象された それ以外の場合は、以下のように動作します。 {コード RoundingMode.DOWN }. なお、これは丸め というモードは、学校でよく習います。

例:

input=5.5 output=6
input=2.5 output=3
input=1.6 output=2
input=1.1 output=1
input=1.0 output=1
input=-1.0 output=-1
input=-1.1 output=-1
input=-1.6 output=-2
input=-2.5 output=-3
input=-5.5 output=-6

  1. 丸い

文字どおりの「最近接値」に丸めるモード。 ただし、両隣が等距離の場合は、{@iteral "neighbor"}に丸める。 を偶数番目の隣人に向けて送信します。 以下のように動作します。 {コード RoundingMode.HALF_UP の左側の桁が、"1 "であれば、"2 "となります。 のように動作します。 {コード RoundingMode.HALF_DOWN 偶数なら なお、この は、統計的に累積を最小にする丸めモードです。 は、一連の計算で繰り返し適用すると、誤差が生じます。 これは、{@literal "Banker's rounding,"}と呼ばれることもあり、以下のように呼ばれています。 主に米国で使用されている。 この丸めモードは、以下のものと類似している。 コード float} と {@コード double} で使用される丸め方針です。 Javaにおける算術演算

    input=5.5 output=6
    input=2.5 output=2
    input=1.6 output=2
    input=1.1 output=1
    input=1.0 output=1
    input=-1.0 output=-1
    input=-1.1 output=-1
    input=-1.6 output=-2
    input=-2.5 output=-2
    input=-5.5 output=-6