我有以下语法
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
parallelCollection如何工作?。
我可以遍历它们并执行转换吗?
驱动程序不会调用RDD转换和操作,而是在其他转换中调用;例如,rdd1.map(x => rdd2.values.count() * x)
无效,因为无法在rdd1.map转换内执行值转换和计数操作。有关更多信息,请参阅SPARK-5063。
这是什么意思?
答案 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将以分布式和并行方式处理它们所有两个文件中的所有记录(我相信是你的用例)。
我做认为我已经回答了我认为基于错误期望的所有三个问题,因此它们都非常相似:)