【问题标题】:Using Option and None in a spark RDD in scala在 scala 的 spark RDD 中使用 Option 和 None
【发布时间】:2017-10-18 21:34:42
【问题描述】:

我有 2 个 RDD[Int] 源和 noSourcesVertex。 我想计算一个可以创建 2 个新 RDD 的地图。

  val sourcesFormatted = sources.map(x => (Some(x), (Some(x), Some(x))))
  val noSourcesVertexFormatted = noSourcesVertex.map(x => (Some(x), (Some(x), None)))
  val outInit = sourcesFormatted.union(noSourcesVertexFormatted)

但是当我执行前面的代码时,我有一个错误:

错误:类型不匹配;发现:org.apache.spark.rdd.RDD[(Some[Int], (Some[Int], None.type))] 需要: org.apache.spark.rdd.RDD[(Some[Int], (Some[Int], Some[Int]))] val outInit = sourcesFormatted.union(noSourcesVertexFormatted)

我认为发生此错误是因为我试图加入 2 个第三列具有不同类型的 RDD。

我没想到会出现这种行为,因为我理解了 Option 的机制,Some(something) 和 None 具有相同的类型 -> Option。

为什么我有这个错误?

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    RDDs 是不变的,因此您必须具体说明类型:

    val sourcesFormatted: RDD[(Option[Int] (Option[Int], Option[Int]))] = 
      sources.map(x => (Some(x), (Some(x), Some(x))))
    val noSourcesVertexFormatted: RDD[(Option[Int] (Option[Int], Option[Int]))] = 
      noSourcesVertex.map(x => (Some(x), (Some(x), None)))
    

    val noSourcesVertexFormatted = 
      noSourcesVertex.map(x => (Some(x), (Some(x), None: Option[Int])))
    

    【讨论】:

      【解决方案2】:

      SomeNone 都是 Option 的子代,反之则不然。

      Option(something) 
      

      将返回

      Some(something)
      

      但是

      Option(null) 
      

      将返回

      None
      

      Some(null)
      

      不会返回

      None 
      

      Somecase class 扩展 Option 表示它不是空的并且有一个值
      None 也是 case class 扩展 Option 表示它是空的并且正在尝试获取值应该抛出NoSuchElementException
      并且
      Option 是一个 object 存储 not null valueSomenull valueNone

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-02
        • 2015-10-31
        • 1970-01-01
        • 2019-06-16
        • 2018-09-29
        • 2016-12-16
        • 2017-06-27
        相关资源
        最近更新 更多