ApacheSpark-Scala-如何将(k,{v1,v2,v3,…})平面映射到((k,v1),(k,v2),(k,v3),…)

ApacheSpark-Scala-如何将(k,{v1,v2,v3,…})平面映射到((k,v1),(k,v2),(k,v3),…),scala,apache-spark,rdd,flatmap,Scala,Apache Spark,Rdd,Flatmap,我明白了: val vector: RDD[(String, Array[String])] = [("a", {v1,v2,..}),("b", {u1,u2,..})] 要转换为: RDD[(String, String)] = [("a",v1), ("a",v2), ..., ("b",u1), ("b",u2), ...] 您知道如何使用flatMap实现这一点吗: vector.flatMap { case (x, arr) => arr.map((x, _)) } 将为

我明白了:

val vector: RDD[(String, Array[String])] = [("a", {v1,v2,..}),("b", {u1,u2,..})]
要转换为:

RDD[(String, String)] = [("a",v1), ("a",v2), ..., ("b",u1), ("b",u2), ...]
您知道如何使用
flatMap

实现这一点吗:

vector.flatMap { case (x, arr) => arr.map((x, _)) }
将为您提供:

scala> val vector = sc.parallelize(Vector(("a", Array("b", "c")), ("b", Array("d", "f"))))
vector: org.apache.spark.rdd.RDD[(String, Array[String])] =
               ParallelCollectionRDD[3] at parallelize at <console>:27


scala> vector.flatMap { case (x, arr) => arr.map((x, _)) }.collect
res4: Array[(String, String)] = Array((a,b), (a,c), (b,d), (b,f))
scala>val vector=sc.parallelize(向量((“a”,数组(“b”,“c”),(“b”,数组(“d”,“f”)))
vector:org.apache.spark.rdd.rdd[(字符串,数组[String])]=
ParallelCollectionRDD[3]在:27处并行化
scala>vector.flatMap{case(x,arr)=>arr.map((x,))}.collect
res4:Array[(String,String)]=数组((a,b)、(a,c)、(b,d)、(b,f))

您肯定需要使用您提到的
flatMap
,但除此之外,您还需要使用scala
map

例如:

val idToVectorValue: RDD[(String, String ] = vector.flatMap((id,values) => values.map(value => (id, value)))

使用单参数函数:

vector.flatMap(data => data._2.map((data._1, _)))

错误:参数数量错误;expected=1(参见前面的注释)如果第二个数组是HashMap怎么办?我尝试了同样的功能。结果只返回映射的第一个元素。@kambiz如果您现在有关于如何使用
HashMap
的其他问题,我建议您打开一个新问题。谢谢!如果这是例行公事,我就这么做。