【问题标题】:scala.MatchError: null errorscala.MatchError:空错误
【发布时间】:2018-09-29 15:08:28
【问题描述】:

我是 Scala 新手,很难找出这段代码的问题。

x.map{case (x1: Any, x2: Any,x3: String) => x1}.count()

投掷

scala.MatchError: null error

这是x的定义

scala> x.cache()
res111: x.type = MapPartitionsRDD[522] at map at <console>:49

scala> x
res109: org.apache.spark.rdd.RDD[(Any, Any, String)] = MapPartitionsRDD[522] at map at <console>:49

scala> x.count()
res112: Long = 64508825

任何指针将不胜感激。

【问题讨论】:

  • 这意味着您的数据中有null。为什么不只是x.map(_._1).count
  • @philantrovert 它会给空指针异常
  • @RameshMaharjan 不,不应该。
  • 我刚试过 ;) val x = sc.parallelize(Seq(("3", 1, "t"), (3.0, "1", "t"), null)) 这也给出了 OP 遇到的相同错误

标签: scala apache-spark rdd


【解决方案1】:

错误信息

scala.MatchError: null

清楚地表明存在null 值而不是(Any, Any, String)

所以你应该在计数之前过滤空值

x.filter(_ != null).map{case (x1: Any, x2: Any,x3: String) => x1}.count()


不确定是否为空

如果您不确定您的数据是否有空值,那么您可以更改匹配大小写,如下所示并在匹配大小写后执行过滤

x.map{_ match {
  case (x1: Any, x2: Any,x3: String) => x1
  case _ => "not matched"
}}.filter(_ != "not matched").count()

【讨论】:

  • OP 能够得到问题中显示的计数。我猜您可以使用Seq(("3", 1, "t"), (3.0, "1", "t"), (null, null, null.asInstanceOf[String]) ) 之类的数据重现错误。您的过滤条件需要更改。
  • @philantrovert sc.parallelize(Seq(("3", 1, "t"), (3.0, "1", "t"), null)).count() 也会给我计数为 3。为什么过滤条件需要更改?如果你澄清原因我会改变它
  • @philantrovert 如果您的 rdd 为 Seq(("3", 1, "t"), (3.0, "1", "t"), (null, null, null.asInstanceOf[String]) ),那么我们会收到错误为 scala.MatchError: (null,null,null) (of class scala.Tuple3) 但 OP 有 scala.MatchError: null 错误
  • 非常感谢。字段中似乎有空值。你的解决方案解决了它。
猜你喜欢
  • 2018-08-29
  • 2014-08-30
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
相关资源
最近更新 更多