[英]how to handle zero divisor case using Option case class in Spark RDD
在 Scala Spark 中計算百分比時,我正在嘗試使用 Option 案例類來處理零分母。 RDD 的集合如下所示:
val counties = Array("New+York", "Bronx","Kings","Queens","Richmond")
val base_url = "https://health.data.ny.gov/resource/xdss-u53e.json?County="
val urls = counties.map(a => base_url+a)
val results = urls.map(u => scala.io.Source.fromURL(u).mkString)
val data_rdd = spark.read.json(sc.parallelize(results)).rdd.map(r => (r(4).toString.slice(0,10), r(0).toString,r(3).toString.toInt,r(5).toString.toInt))
我想要做的是返回一個元組(日期、狀態、百分比),其中百分比是通過將第三個元素除以第四個元素來計算的(即使用第一個 Int 除第二個 Int)。 但是,由於某些除數為零,我確實需要使用 Option 案例類來處理這些案例,但我對如何使用 Scala Spark 這樣做感到困惑。
以下是我嘗試過的:
data_rdd.map{ case (a,b,c,d) => (a,b,c/d)
case _ => (a,b,0)}
這段代碼給我一個錯誤:
<console>:28: error: not found: value a
case _ => (a,b,0)}
誰能幫我想出一種方法來使用選項案例類處理零除數? 太感謝了!
您可以為此使用scala.util.Try
。 基本上,你可以給它一個可能會失敗的輸入,然后把它變成一個選項。 一個簡化的示例如下所示:
import org.apache.spark.sql._
import spark.implicits._
import scala.util.Try
val columnNames = Seq("String", "Int1", "Int2")
val df = Seq(
("Alex", 3, 4),
("John", 1, 2),
("Alice", 7, 0),
("Mark", 5, -3)
).toDF(columnNames: _*)
val output = df.map{
row => {
// Dividing int1 by int2
val division = Try(row.getInt(1) / row.getInt(2)).toOption
// Creating a new row with an extra element: division
(row.getString(0), row.getInt(1), row.getInt(2), division)
}
}.toDF(columnNames :+ "division": _*)
output.show
+------+----+----+--------+
|String|Int1|Int2|division|
+------+----+----+--------+
| Alex| 3| 4| 0|
| John| 1| 2| 0|
| Alice| 7| 0| null|
| Mark| 5| -3| -1|
+------+----+----+--------+
這種划分在發生時不會失敗,它只會在您的行中創建一個null
條目。
我為此使用Dataframes
,因為它是我的首選 API,但您也可以對 RDD 做同樣的事情。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.