【问题标题】:Using tuple as a key in scala在scala中使用元组作为键
【发布时间】:2017-03-04 10:52:03
【问题描述】:
  • 问题 1:我可以在 Scala 中使用元组作为映射的键吗?
  • 问题 2:如果是,如何创建以元组为键的映射?
  • 问题 3:我想将我的 scala 映射转换为 RDD,在以下情况下我该怎么办?我正在尝试这样做

    var mapRDD = sc.parallelize(map.toList)
    

    这是正确的做法吗?

  • 问题 4:对于这个特定的代码 sn-p,当我在 map 上执行 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)

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

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

    例如:

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

    然后您可以尝试使用foreach 打印输出

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

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

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

    【讨论】:

    • 甚至Map(1 -&gt; 25 -&gt; "shankar", 2 -&gt; 35 -&gt; "ramesh")
    • @Yawar:我喜欢你创建地图的方式。+1
    • 我相信你应该使用.collect.foreach(println)来打印RDD:spark.apache.org/docs/latest/…
    • 可以使用take减少数据量,见this answer。无论如何,这是Apache自己的(!!)文档推荐的一种方式
    • @TzachZohar 是的local[4] 将使用单个进程,是的,您需要减少打印的数据量(第二个在我提供的链接中的 Spark Docs 中精确描述)。甚至local[4] 的行为也与local[1] 不同(确切地说是排序:正如您所指出的,操作将并行运行)。我的意思是,我们大多不知道它是否真实,所以最好提供在最坏情况下有效的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2017-08-20
    • 2020-06-17
    • 1970-01-01
    • 2019-10-07
    • 2010-11-28
    • 2019-02-12
    相关资源
    最近更新 更多