Деление ручки Scala на ноль по совокупности - PullRequest
0 голосов
/ 19 октября 2019

В scala / spark я пытаюсь сделать что-то вроде:

df.withColumn("average_value",
    sum($"myvalue").over(myWindow) / sum($"entries").over(myWindow))

, что иногда приводит к делению на ноль. Я пытался использовать комбинацию когда, но вы не можете делать, когда по совокупности. Я заметил, что если значение делится на ноль, то оно возвращает ноль, так что, может быть, есть какой-нибудь способ заменить ноль на 0 в этом случае?

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Вы можете использовать оператор CASE, чтобы справиться с этим. Coalesce используется для замены NULL некоторым значением и не может использоваться для проверок NULL.

import org.apache.spark.sql.expressions.Window

case class Salary(depName: String, empNo: Long, salary: Long)
  val  empsalary = Seq(
  Salary("sales", 1, 5000),
  Salary("sales", 3, 4800),
  Salary("sales", 4, 4800),
  Salary("personnel", 0, 3500),
  Salary("develop", 7, 4200),
  Salary("develop", 8, 6000),
  Salary("develop", 9, 4500),
  Salary("develop", 10, 5200),
  Salary("develop", 11, 5200)).toDS

empsalary.show(2)
+---------+-----+------+
|  depName|empNo|salary|
+---------+-----+------+
|    sales|    1|  5000|
|personnel|    2|  3900|
+---------+-----+------+
only showing top 2 rows


val byDepName = Window.partitionBy('depName')

empsalary.withColumn("avg", sum("salary").over(byDepName)/ (when(sum("empNo").over(byDepName) ===0,1)).otherwise(sum("empNo").over(byDepName))).show

+---------+-----+------+-----------------+                                      
|  depName|empNo|salary|              avg|
+---------+-----+------+-----------------+
|  develop|    7|  4200|557.7777777777778|
|  develop|    8|  6000|557.7777777777778|
|  develop|    9|  4500|557.7777777777778|
|  develop|   10|  5200|557.7777777777778|
|  develop|   11|  5200|557.7777777777778|
|    sales|    1|  5000|           1825.0|
|    sales|    3|  4800|           1825.0|
|    sales|    4|  4800|           1825.0|
|personnel|    0|  3500|           3500.0|
+---------+-----+------+-----------------+

Спасибо, Jayadeep

0 голосов
/ 19 октября 2019

Я обнаружил, что выполнение следующего будет обрабатывать нулевой результат, но не предотвращает деление на ноль:

df.withColumn("average_value",
   coalesce(sum($"myvalue").over(myWindow) / sum($"entries").over(myWindow)), lit(0.0))
...