Как округлить десятичную дробь в Scala Spark - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть (большой ~ 1 миллион) фрейм данных Scala Spark со следующими данными:

id,score
1,0.956
2,0.977
3,0.855
4,0.866
...

Как дискретизировать / округлить значения до ближайшего десятичного знака 0,05?

Ожидаетсярезультат:

id,score
1,0.95
2,1.00
3,0.85
4,0.85
...

Хотел бы избежать использования UDF для максимизации производительности.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы можете указать свою схему при преобразовании в dataframe,

Пример:

DecimalType (10, 2) для столбца в вашей customSchema при загрузке данных.

id,score
1,0.956
2,0.977
3,0.855
4,0.866
...



import org.apache.spark.sql.types._

val mySchema = StructType(Array(
  StructField("id", IntegerType, true),
   StructField("score", DecimalType(10, 2), true)
))

spark.read.format("csv").schema(mySchema).
  option("header", "true").option("nullvalue", "?").
  load("/path/to/csvfile").show
0 голосов
/ 26 декабря 2018

Вы можете сделать это, используя искровые встроенные функции, например так:

dataframe.withColumn("rounded_score", round(col("score") * 100 / 5) * 5 / 100)
  1. Умножьте это так, чтобы желаемая точность была целым числом.
  2. Затем разделите это число на 5 и округлите.
  3. Теперь число делится на 5, поэтому умножьте его на 5, чтобы получить обратно все число
  4. Разделите на 100, чтобы снова получить точность.

результат

+---+-----+-------------+
| id|score|rounded_score|
+---+-----+-------------+
|  1|0.956|         0.95|
|  2|0.977|          1.0|
|  3|0.855|         0.85|
|  4|0.866|         0.85|
+---+-----+-------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...