在元组中使用元组作为键

时间:2016-10-22 04:25:37

标签: scala apache-spark

  • 问题1:我可以在Scala中使用元组作为地图的键吗?
  • 问题2:如果是,我如何创建以元组为键的地图?
  • 问题3:我想将我的scala地图转换为RDD,在下列情况下我该怎么办?我试图这样做

    var mapRDD = sc.parallelize(map.toList)
    

    这是正确的方法吗?

  • 问题4:对于此特定代码段,当我在地图上执行println时,它没有值。

我没有包含整个代码,基本上mapAgainstValue包含userId作为键和朋友列表作为值。我想在密钥中使用以下转换重新创建一个地图RDD。 空地图的原因是什么?

var mapAgainstValue = logData.map(x=>x.split("\t")).filter(x => x.length == 2).map(x => (x(0),x(1).split(",")))
     var map:Map[String,List[String]] = Map()
            var changedMap = mapAgainstValue.map{
              line =>
                var key ="";
                for(userIds <- line._2){
                    if(line._1.toInt < userIds.toInt){
                      key =line._1.concat("-"+userIds);
                    }
                    else {
                      key = userIds.concat("-" + line._1);
                    }
                  map += (key -> line._2.toList)
                }
            }
            changedMap.collect()
            map.foreach(println)

1 个答案:

答案 0 :(得分:4)

是的,您可以使用元组作为Map中的键。

例如:

val userMap = Map(
    (1, 25) -> "shankar",
    (2, 35) -> "ramesh")

然后您可以尝试使用foreach

打印输出
val userMapRDD = sparkContext.parallelize(userMap.toSeq, 2)
  mapRDD.foreach(element => {
    println(element) 
  })

如果您想将mapRDD转换为其他内容。以下代码仅返回age和name作为元组。

  val mappedRDD = userMapRDD.map {
    case ((empId: Int, age: Int), name: String) => {
      (age, name)
    }
  }