簡體   English   中英

如何在 Spark RDD 中使用 Option 案例類處理零除數案例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM