Spark Scala - Split Map、Getkey等

0h4hbjxa  于 2023-05-07  发布在  Scala
关注(0)|答案(1)|浏览(199)

我有一个文本文件,其中包含以下内容:

A>B,C,D
B>A,C,D,E
C>A,B,D,E
D>A,B,C,E
E>B,C,D

我想写一个Spark-Scala脚本来获得以下内容:(对于每个左成员,我们给予所有右成员。)

(A,B)
(A,C)
(A,D)
(B,A)
(B,C)
(B,D)
(B,E)
...

我试图通过Map,并获得钥匙饲料一个新的Map与我的结果,但它没有工作。
下面是我的代码(更像伪代码):

import scala.io.Source

// Loading file
val file = sc.textFile("friends.txt")

// MAP
// A;B
// A;C
// ...

var associations_persons_friends:Map[Char,Char] = Map()

var lines = file.map(line=>line.split(">"))

for (line <- lines)
{
    val person = line.key
    
    for (friend <- line.value.split(","))
    {
        associations_persons_friends += (person -> friend)
    }
}

associations_persons_friends.collect()

val rdd = sc.parallelize(associations_persons_friends)
rdd.foreach(println)

// GROUP
// For each possible pair, all associated values
// AB;B-C-D-A-C-D-E

// REDUCE
// For each pair we keep occurrences >= 2
// AB;C-D

我想知道是否有可能在Spark-Scala中编写这样的基本代码,因为我在网上找不到任何满足我需求的答案。谢谢你的帮助。

kpbwa7wx

kpbwa7wx1#

您可以使用mapflatMap的组合来实现您的要求,如

val rdd = sc.textFile("path to the text file")

rdd.map(line => line.split(">")).flatMap(array => array(1).split(",").map(arr => (array(0), arr))).foreach(println)

您的输出应为

(A,B)
(A,C)
(A,D)
(B,A)
(B,C)
(B,D)
(B,E)
(C,A)
(C,B)
(C,D)
(C,E)
(D,A)
(D,B)
(D,C)
(D,E)
(E,B)
(E,C)
(E,D)

希望答案对大家有帮助

相关问题