Spark - Scala:处理一行后返回多个<key,value>

mad*_*die 3 scala apache-spark

我有一个如下所示的数据集 -

0 - 1,2,4
1 - 0,4
2 - 0,4
4 - 2,1,0

我想读取每一行并将其转换为如下所示的内容

//对于0-1,2,4
(0,1)<2,4>
(0,2)<1,4>
(0,4)<1,2>行

//对于行1 - 0,4
(0,1)<4>
(1,4)<0>

//始终在对中首先出现较小的数字

即,读取" - "分隔符上分隔的每一行.所以我从数据集的第1行得到0和1,2,4.在那之后,我想要创建对.例如,(0,1)将是转换后的地图的关键,其值应为2,4.

完成后,我希望能够按键对值进行分组

例如(0,1)<2,4> <4>

并将它们相交以得到4.

可以这样做吗?我的做法是对的吗?

我到目前为止编写了以下代码 -

var mapOperation = logData.map(x=>x.split("\t")).filter(x => x.length == 2).map(x => (x(0),x(1)))
// reading file and creating the map Example - key 0 value 1,2,4

//from the first map, trying to create pairs
var mapAgainstValue = mapOperation.map{
line =>
val fromFriend = line._1
val toFriendsList = line._2.split(",")
(fromFriend -> toFriendsList)
}

val newMap = mapAgainstValue.map{
line =>
var key ="";
for(userIds <- line._2){
key =line._1.concat(","+userIds);
(key -> line._2.toList)
}

}
Run Code Online (Sandbox Code Playgroud)

问题是我无法在newMap上调用groupByKey.我假设我创建地图的方式存在一些问题?

感谢任何帮助.

谢谢.

Shi*_*nsh 6

您的问题可以像这样解决:

 val inputRDD=sc.textFile("inputFile.txt")  
inputRDD.flatMap{a=>
          val list=a.split("--")
          val firstTerm=list(0)
          val secondTermAsList=list(1).split(",")
          secondTermAsList.map{b=>
          val key=if(b>firstTerm) (firstTerm,b) else (b,firstTerm)
          val value=secondTermAsList diff List(b)
          (key,value)
          }
          }
Run Code Online (Sandbox Code Playgroud)

此代码导致此输出:

+-----+------+
|_1   |_2    |
+-----+------+
|[0,1]|[2, 4]|
|[0,2]|[1, 4]|
|[0,4]|[1, 2]|
|[0,1]|[4]   |
|[1,4]|[0]   |
|[0,2]|[4]   |
|[2,4]|[0]   |
|[2,4]|[1, 0]|
|[1,4]|[2, 0]|
|[0,4]|[2, 1]|
+-----+------+
Run Code Online (Sandbox Code Playgroud)

我希望这能解决你的问题!