Apache-Spark:针对RDD的嵌套for-understanding

时间:2017-03-30 16:05:08

标签: scala apache-spark rdd for-comprehension

我正在尝试使用Spark-RDD等效的本地Scala代码:

val intList1=List(1,2,3,4,5,6)
val intList2=List(10,20,30,40,50,60)

val divisiblePairs=for(
    int1<-intList1;
    int2<-intList2
    if int2 % int1 == 0
) yield(int1,int2)

divisiblePairs.groupBy(_._1) //Map(6 -> List((6,30), (6,60)),...)

我试过了:

val intRDD1=sc.parallelize(List(1,2,3,4,5,6))
val intRDD2=sc.parallelize(List(10,20,30,40,50,60))

val divisiblePairs=
for(
    int1<-intRDD1;
    int2<-intRDD2
    if int2 % int1 == 0
) yield(int1,int2)

这需要一些额外的工作,但我得到的错误,即使是在理解的主体中:

  

错误:类型不匹配;发现:   org.apache.spark.rdd.RDD [(Int,Int)]必需:TraversableOnce [?]              INT2&LT; -intList2

1 个答案:

答案 0 :(得分:5)

错误是预期的,因为Spark不支持嵌套。您可以使用cartesian方法执行相同的操作:

for {
  (int1, int2) <- intRDD1.cartesian(intRDD2)
  if int2 % int1 == 0
} yield(int1, int2)