Scala 在Spark中反转一对的键和值

Scala 在Spark中反转一对的键和值,scala,apache-spark,Scala,Apache Spark,我想反转客户ID和访问次数的密钥和值对: scala> val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_).foreach(println) 结果: (48784,3) (47847,10) (87673,8) (67654,4) 我想把这一对反转成这样: (3,48784) (10,47847) (8,87673) (4,67654) va

我想反转客户ID和访问次数的密钥和值对:

scala> val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_).foreach(println)
结果:

(48784,3)
(47847,10)
(87673,8)
(67654,4)
我想把这一对反转成这样:

(3,48784)
(10,47847)
(8,87673)
(4,67654)
val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).
    reduceByKey(_+_).map(X => (x._2,x._1)).foreach(println)
我在这个网站上研究过这个问题的类似答案,并尝试了以下方法

  • input.map{pair=>pair.swap}

  • val PairReverse=pair.map(X=>(X.\u 2,X.\u 1))

  • val PairReverse=pair.map(X=>((1)、(0))

  • 我不断得到以下错误:

    “映射值不是此单元的成员”

    只需从下一行中删除
    .foreach(println)
    ,就可以了

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_).foreach(println)
    
    as
    foreach
    是一个动作,返回
    unit()
    foreach
    定义如下

    def foreach(f:T=>单位):单位

    删除
    foreach()
    后,以下内容应该对您有用

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    val pairReverse = input.map(pair => pair.swap)
    pairReverse.foreach(println)
    

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    val pairReverse = pair.map(x => (x._2,x._1))
    pairReverse.foreach(println)
    
    但是您尝试的上一个贴图将不起作用
    ,即

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    val pairReverse = pair.map(X => ((1),(0)))
    pairReverse.foreach(println)
    
    因为它将为您拥有的每一对生成(1,0)元组

    (1,0)
    (1,0)
    (1,0)
    (1,0)
    
    我希望答案是有帮助的

    只要从下一行中删除
    .foreach(println)
    ,就可以了

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_).foreach(println)
    
    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_).foreach(println)
    
    as
    foreach
    是一个动作,返回
    unit()
    foreach
    定义如下

    def foreach(f:T=>单位):单位

    删除
    foreach()
    后,以下内容应该对您有用

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    val pairReverse = input.map(pair => pair.swap)
    pairReverse.foreach(println)
    

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    val pairReverse = pair.map(x => (x._2,x._1))
    pairReverse.foreach(println)
    
    但是您尝试的上一个贴图将不起作用
    ,即

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    val pairReverse = pair.map(X => ((1),(0)))
    pairReverse.foreach(println)
    
    因为它将为您拥有的每一对生成(1,0)元组

    (1,0)
    (1,0)
    (1,0)
    (1,0)
    
    我希望答案是有帮助的

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_).foreach(println)
    
    这将返回
    Unit
    foreach(println)
    使该对成为单元

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    // now print the pair rdd
    pair.foreach(println)
    
    //Now you can use it to swap using one of the following
    pair.map(_.swap)
    pair.map(x => (x._2,x._1))
    pair.map(X => ((1),(0)))
    
    因此,只需删除
    foreach(println)
    ,即可正常工作

    这将返回
    Unit
    foreach(println)
    使该对成为单元

    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).reduceByKey(_+_)
    // now print the pair rdd
    pair.foreach(println)
    
    //Now you can use it to swap using one of the following
    pair.map(_.swap)
    pair.map(x => (x._2,x._1))
    pair.map(X => ((1),(0)))
    

    因此,只需删除
    foreach(println)
    ,并应按预期工作
    属于
    单元类型
    ,因为使用
    foreach
    ,因为它不是一个功能操作(其结果是
    单元
    )。如果添加
    .map(X=>(X.\u 2,X.\u 1))
    在foreach调用之前,如下所示:

    (3,48784)
    (10,47847)
    (8,87673)
    (4,67654)
    
    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).
        reduceByKey(_+_).map(X => (x._2,x._1)).foreach(println)
    

    它应该可以工作。

    属于
    单元
    ,因为使用了
    foreach
    ,因为它不是一个函数操作(它的结果是一个
    单元
    )。如果在
    foreach
    调用之前添加
    .map(X=>(X.\u2,X.\u1))
    ,如下所示:

    (3,48784)
    (10,47847)
    (8,87673)
    (4,67654)
    
    val pair = input.map(line => line.split(" ") (2)).map(input => (input, 1)).
        reduceByKey(_+_).map(X => (x._2,x._1)).foreach(println)
    

    它应该可以工作。

    下面是使用
    collect
    交换每个元素的键、值对的方法

     val map = Map(48784->3, 47847 -> 10, 87673 -> 8, 67654 -> 4)
     map: scala.collection.immutable.Map[Int,Int] = Map(48784 -> 3, 47847 -> 10, 87673 -> 8, 67654 -> 4)
    
    scala> map.collect{
        case e => e._2 -> e._1
    }
    res0: scala.collection.immutable.Map[Int,Int] = Map(3 -> 48784, 10 -> 47847, 8 -> 87673, 4 -> 67654)
    

    下面是使用
    collect

     val map = Map(48784->3, 47847 -> 10, 87673 -> 8, 67654 -> 4)
     map: scala.collection.immutable.Map[Int,Int] = Map(48784 -> 3, 47847 -> 10, 87673 -> 8, 67654 -> 4)
    
    scala> map.collect{
        case e => e._2 -> e._1
    }
    res0: scala.collection.immutable.Map[Int,Int] = Map(3 -> 48784, 10 -> 47847, 8 -> 87673, 4 -> 67654)