gpt4 book ai didi

scala - 元组上的模式匹配

转载 作者:行者123 更新时间:2023-12-02 08:06:55 28 4
gpt4 key购买 nike

对于以下条件 - 其中已为 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

最佳答案

我假设 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

P.S. 您通常可以使用 Row 的 unapply 函数从 Row 中简化此类“提取”,即在 Row(a, b, ... ):

df.map {
case Row(s1: java.math.BigDecimal, s2: java.math.BigDecimal, _*) => (s1, s2)
}

关于scala - 元组上的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50609948/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com