什么是“WARN ParallelCollectionRDD:Spark不支持嵌套RDD(参见SPARK-5063)”?

时间:2016-12-27 07:14:35

标签: scala apache-spark spark-streaming

我有以下语法

val data = sc.textFile("log1.txt,log2.txt")
val s = Seq(data)
val par = sc.parallelize(s)

我获得的结果如下:

  

警告ParallelCollectionRDD:Spark不支持嵌套RDD(参见SPARK-5063)
  par:org.apache.spark.rdd.RDD [org.apache.spark.rdd.RDD [String]] = ParallelCollectionRDD [2]并行化:28

问题1

parallelCollection如何工作?。

问题2

我可以遍历它们并执行转换吗?

问题3

驱动程序不会调用RDD转换和操作,而是在其他转换中调用;例如,rdd1.map(x => rdd2.values.count() * x)无效,因为无法在rdd1.map转换内执行值转换和计数操作。有关更多信息,请参阅SPARK-5063。

这是什么意思?

1 个答案:

答案 0 :(得分:1)

(确实是一个有趣的案例)

如果有疑问,我总是建议遵循Scala中的类型(在所有类型之后,为什么我们Scala开发人员首先使用该语言,不是吗?)

所以,让我们揭示一下类型:

scala> val data = sc.textFile("log1.txt,log2.txt")
data: org.apache.spark.rdd.RDD[String] = log1.txt,log2.txt MapPartitionsRDD[1] at textFile at <console>:24

scala> val s = Seq(data)
s: Seq[org.apache.spark.rdd.RDD[String]] = List(log1.txt,log2.txt MapPartitionsRDD[1] at textFile at <console>:24)

scala> val par = sc.parallelize(s)
WARN ParallelCollectionRDD: Spark does not support nested RDDs (see SPARK-5063)
par: org.apache.spark.rdd.RDD[org.apache.spark.rdd.RDD[String]] = ParallelCollectionRDD[3] at parallelize at <console>:28

正如您所知,Spark中不支持org.apache.spark.rdd.RDD[org.apache.spark.rdd.RDD[String]](但是它确实被Scala编译器接受,因为它匹配SparkContext.parallelize方法的签名...不幸的是)。

你真的不需要val s = Seq(data),因为两个文件log1.txt,log2.txt中的记录已经在“内部”RDD中,Spark将以分布式和并行方式处理它们所有两个文件中的所有记录(我相信是你的用例)。

认为我已经回答了我认为基于错误期望的所有三个问题,因此它们都非常相似:)