Spark/Scala:展开(list[String],String)元组列表

Spark/Scala:展开(list[String],String)元组列表,scala,apache-spark,tuples,scala-collections,rdd,Scala,Apache Spark,Tuples,Scala Collections,Rdd,基本上只针对Scala 给定一个带有表单元素的RDD,如何进行以下转换 (List[String], String) => (String, String) e、 g 因此,我认为RDD FlatMapValue最适合这种情况 val A = List((List(A,B,C),X),(List(A,B,C),Y)) val rdd = sc.parallelize(A) val output = rdd.map(x=>(x._2,x._1)).flatMapValues(x=&g

基本上只针对Scala

给定一个带有表单元素的RDD,如何进行以下转换

(List[String], String) => (String, String)
e、 g


因此,我认为RDD FlatMapValue最适合这种情况

val A = List((List(A,B,C),X),(List(A,B,C),Y))
val rdd = sc.parallelize(A)
val output = rdd.map(x=>(x._2,x._1)).flatMapValues(x=>x)
它将X映射到列表(A,B,C)中的每个值,从而产生RDD[(X,A),(X,B),(X,C)…(Y,A),(Y,B),(Y,C)]

将为您提供:

List((1,A), (2,A), (3,A))

使用Spark,您可以通过以下方式解决问题:

对象应用程序{
def main(参数:数组[字符串]){
val输入=序列((列表(“A”、“B”、“C”)、“X”)、(列表(“C”、“D”、“E”)、“Y”))
val conf=new SparkConf().setAppName(“简单应用程序”).setMaster(“本地[4]”)
val sc=新的SparkContext(配置)
val rdd=sc.parallelize(输入)
val结果=rdd.flatMap{
案例(列表、标签)=>{
list.map((u,label))
}
}
结果.foreach(println)
}
}
这将输出:

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

使用Beautil进行理解并使参数通用

    def convert[F, S](input: (List[F], S)): List[(F, S)] = {
    for {
      x <- input._1
    } yield {
      (x, input._2)
    }
  }
我会给你

List((1,A), (2,A), (3,A))

这是一个极好的答案。谢谢。你救了我一天。
(C,Y)
(D,Y)
(A,X)
(B,X)
(E,Y)
(C,X)
    def convert[F, S](input: (List[F], S)): List[(F, S)] = {
    for {
      x <- input._1
    } yield {
      (x, input._2)
    }
  }
convert(List(1, 2, 3), "A")
List((1,A), (2,A), (3,A))