Spark scala:将键值对中的数值更改为长/整数以连接两个映射

Spark scala:将键值对中的数值更改为长/整数以连接两个映射,scala,apache-spark,join,rdd,changetype,Scala,Apache Spark,Join,Rdd,Changetype,嗨,我是使用scala的新手。我有两个不同的文件,我已经创建了两个地图,如下所示: data 1 1 : 2 2 : 1,3,4 3 : 2,4 4 : 2, 3 (1, apple, 1) (2, banana, 3) (3, kiwi, 2) (4, orange, 2) (5, strawberry, 0) map1将计算“:”之后的每个键出现次数,map1的输出为: (1, 1) (2, 3) (3, 2) (4, 2) 数据2: apple banana kiwi orange

嗨,我是使用scala的新手。我有两个不同的文件,我已经创建了两个地图,如下所示:

data 1
1 : 2
2 : 1,3,4
3 : 2,4
4 : 2, 3
(1, apple, 1)
(2, banana, 3)
(3, kiwi, 2)
(4, orange, 2)
(5, strawberry, 0)
map1将计算“:”之后的每个键出现次数,map1的输出为:

(1, 1)
(2, 3)
(3, 2)
(4, 2)
数据2:

apple
banana
kiwi
orange
strawberry
map2将告知元件位置,其输出为:

(1, apple)
(2, banana)
(3, kiwi)
(4, orange)
(5, strawberry)
我需要的是将两个映射与输出连接起来,如下所示:

data 1
1 : 2
2 : 1,3,4
3 : 2,4
4 : 2, 3
(1, apple, 1)
(2, banana, 3)
(3, kiwi, 2)
(4, orange, 2)
(5, strawberry, 0)
我只能使用org.apache.spark.SparkConf和org.apache.spark.SparkCotext。以下是我目前使用的代码:

    val sc = new SparkContext (conf)
    val data1 = sc.textFile("input.txt")
    val map1 = data1.map(x => x.split(":")(0), x.split(":")(1))).flatMap{case (y,z) => z.split("\\s+").map((y,_)}
.filter(_._2.nonEmpty).sortByKey().countByKey()
    val data2 = sc.textFile("input2.txt")
    val map2 = data2.zipWithIndex().map{ case(v, index) => (v,index + 1)}
.map(pair => pair.swap)

    val merge_map = map2.join(map1)
我想连接我制作的两张地图,但这会给我带来如下错误:

type mismatch; 
found: scala.collection.Map[String, Long] 
required: org.apache.spark.rdd.RDD[(Long,?)]
我在想也许我需要改变map1/map2中的值的类型。有什么办法吗?谢谢大家!

后续问题

现在,我需要使用相同的数据创建map3,它计算了“:”之后右侧每个值的出现次数。再次加入地图2。这是map3的输出以及我需要的map3和map2的连接结果

输出映射3:

(1,1)
(2,3)
(3,2)
(4,2)
加入map2和map3:

(1, apple, 1)
(2, banana, 3)
(3, kiwi, 2)
(4, orange, 2)
(5, strawberry, 0)
以下是我使用的代码:

val map3 = data1.map(x => x.split(":")(0).toLong, x.split(":")(1))).flatMap{case (y,z) => z.split("\\s+").map((_,1)}.reduceByKey(_+_)

val merge_map23 = map2.leftOuterJoin(map3)
我有一个错误:

type mismatch; 
    found: org.apache.spark.rdd.RDD[String, Long] 
    required: org.apache.spark.rdd.RDD[(Long,?)]

我已经用下面的答案修复了前面的代码,但是现在我得到了这个错误。谢谢

不要使用
countByKey
。使用
reduceByKey

val map1 = data1.map(x => x.split(":")(0), x.split(":")(1)))
  .flatMap{case (y,z) => z.split("\\s+").map((y,_)}    
  .filter(_._2.nonEmpty).mapValues(_ => 1).reduceByKey(_ + _)
然后不要使用
collectamap

val map2 = data2.zipWithIndex().map{ case(v, index) => (v,index + 1)}
  .map(pair => pair.swap)
最后加入

map1.join(map2)

如果我删除了.collectAsMap,则在创建
map2
@vdep时远程
.collectAsMap
,它会向我抛出一个表示类型不匹配的错误;找到:scala.collection.Map[String,Long]必需:org.apache.spark.rdd.rdd[(Long,)]。有什么办法解决这个问题吗?谢谢,成功了,谢谢!我可以知道为什么我使用reduceByKey而不是countByKey时它会起作用吗?我试着用我的后续问题(上面编辑)做同样的事情,但它仍然抛出类型不匹配的错误?