【问题标题】:create tuple with 4 elements using tuple with 3 elements and an extra object使用具有 3 个元素和一个额外对象的元组创建具有 4 个元素的元组
【发布时间】:2020-04-09 18:53:09
【问题描述】:

我有一个 (Array[Short], Array[Short], Array[Short]) 类型的元组。 现在我想要一个带有元素的元组应该是 (Array[Short], Array[Short], Array[Short]) + Obj

基本上是在创建一个映射,检查包含 3 个元素的元组,如果找到,则创建一个包含这 3 个元素和第四个元素的新元组。

val obj1: collection.mutable.HashMap[String, (Array[Short], Array[Short], Array[Short])] = HashMap.empty
val combJoinedMap: collection.mutable.HashMap[String, (Array[Short], Array[Short], Array[Short], Object)] = HashMap.empty

【问题讨论】:

  • 1.这与火花有什么关系? 2.你试过什么?至少提供预期的输入和输出

标签: scala apache-spark tuples


【解决方案1】:

无论reducedCreditStage3ARddMapped 的类型。你在这里得到Option[Array[Short]],因为.get 来自Map 返回可选,然后你将Option[Array[Short]] 与某种类型结合在一起,这是代码气味。

在不知道crdStgRdd._2 的类型的情况下,我可以说你可以这样做:

val t: Array[Short] = combMap.getOrElse(crdStgRdd._1), Array.empty[Short]), 
val XXX = Array.empty[Short]
combJoinedMap.put(crdStgRdd._1,  (t, crdStgRdd._2, XXX))

你需要用有意义的东西替换元组的 XXX 第三个元素,或者你应该有这样的结构 reducedCreditStage3ARddMapped

val reducedCreditStage3ARddMapped: HashMap[String, (Array[Short], Array[Short])]

注意:请具体说明您的类型并明确错误,否则人们应该只是猜测而无法提供帮助。

【讨论】:

  • @anurag1007 如果有帮助,您可以接受我的回答
【解决方案2】:

您可以使用collect 一次性过滤和更改每个元素,如下所示:

  val map: Map[String, (Array[Short], Array[Short], Array[Short])] = Map.empty 
  val combJoinedMap = map.collect {
    case (key, (array1, array2, array3)) if true /*check whatever condition you need*/ =>
      key -> (array1, array2, array3, new Object)
  }

部分函数 case (key, (array1, array2, array3)) ... 将键和值作为 3 个元素的元组解构到每个单独的组件中。

【讨论】:

  • 如果第一个地图中存在密钥,我会尝试根据代码输入地图。
  • 在这种情况下只做地图而不是收集
【解决方案3】:

如果第一个地图中存在密钥,我会尝试根据代码输入地图。这就是我想要做的:

val combMap: collection.mutable.HashMap[String, (Array[Short], Array[Short], Array[Short])] = HashMap.empty val combJoinedMap: collection.mutable.HashMap[String, (Array[Short], Array[Short], Array[Short], Object)] = HashMap.empty

  combinationRdd.foreach(combRdd =>{
    combMap.put(combRdd._1, (combRdd._2._1, combRdd._2._2, combRdd._2._3))
  })

  reducedCreditStage3ARddMapped.foreach(crdStgRdd =>{
    if(combMap.contains(crdStgRdd._1))
        combJoinedMap.put(crdStgRdd._1, ((combMap.get(crdStgRdd._1)) + crdStgRdd._2))
  })

但是 combJoinedMap.put(crdStgRdd._1, ((combMap.get(crdStgRdd._1)) + crdStgRdd._2)) 给出错误

【讨论】:

  • 你能显示reducedCreditStage3ARddMapped的类型吗?
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2021-08-06
  • 2012-10-04
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多