Сопоставление с образцом на кортеже - PullRequest
0 голосов
/ 30 мая 2018

Для приведенного ниже условия - в котором сопоставление с образцом было определено для Tuple2(BigDecimal,BigDecimal)

  (r.get(0), r.get(1)) match {
    case (r0: BigDecimal, r1: BigDecimal) => (bigDecimalNullToZero(r0), bigDecimalNullToZero(r1))
    case (r0,r1)  => {
      error(s"Unable to compare [$r0] and [$r1]"); (0L,0L)
    }
  }

, почему совпадение не распознается?

enter image description here

enter image description here

1 Ответ

0 голосов
/ 30 мая 2018

Я собираюсь предположить, что r в данном случае имеет тип org.apache.spark.sql.Row - если это так, вы просто используете неправильный класс BigDecimal - вы соответствуете Scalaвстроенный scala.math.BigDecimal, в то время как Spark использует java.math.BigDecimal под капотом.

Итак, если вы подходите, используя класс Java, это должно работать как ожидалось:

(r.get(0), r.get(1)) match {
  case (r0: java.math.BigDecimal, r1: java.math.BigDecimal) => (bigDecimalNullToZero(r0), bigDecimalNullToZero(r1))
  case (r0,r1)  => {
    error(s"Unable to compare [$r0] and [$r1]"); (0L,0L)
  }
}

Я использовал этот полный примерчтобы проверить это:

import spark.implicits._

val df = Seq(
  (BigDecimal(2.1), BigDecimal(2.3)) // using Scala's BigDecimal to build DF
).toDF("name", "hit_songs")

df.foreach { r: Row => (r.get(0), r.get(1)) match {
  case (s1: BigDecimal, s2: BigDecimal) => println("found Scala BigDecimals")
  case (s1: java.math.BigDecimal, s2: java.math.BigDecimal) => println("found Java BigDecimals")
  case (s1, s2) => println(s"Not found")
}}

// prints: found Java BigDecimals

PS Обычно вы можете упростить такие «извлечения» из строки, используя функцию unapply строки, то есть сопоставление с Row(a, b, ...):

df.map {
  case Row(s1: java.math.BigDecimal, s2: java.math.BigDecimal, _*) => (s1, s2)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...