scala - 为什么SparkContext.textFile的partition参数不生效?

标签 scala apache-spark rdd

scala> val p=sc.textFile("file:///c:/_home/so-posts.xml", 8) //i've 8 cores
p: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[56] at textFile at <console>:21

scala> p.partitions.size
res33: Int = 729

我预计会打印 8 个任务,但我在 Spark UI 中看到了 729 个任务

编辑:

按照@zero323的建议调用repartition()

scala> p1 = p.repartition(8)
scala> p1.partitions.size
res60: Int = 8
scala> p1.count

即使 Spark-shell 打印 8,我仍然在 Spark UI 中看到 729 个任务。

最佳答案

如果你看一下签名

textFile(path: String, minPartitions: Int = defaultMinPartitions): RDD[String] 

您会看到您使用的参数称为minPartitions,这几乎描述了它的功能。在某些情况下,甚至会被忽略,但这是另一回事。幕后使用的输入格式仍然决定如何计算分割。

在这种特殊情况下,您可能可以使用mapred.min.split.size来增加分割大小(这将在加载期间起作用)或在加载后简单地重新分区(这数据加载后生效)但一般情况下应该没有必要。

关于scala - 为什么SparkContext.textFile的partition参数不生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467573/

相关文章:

mysql - 如何从MySQL导入数据到HDFS并通过外键关系拆分/分区/分发数据?

apache-spark - 如何将行rdd转换为类型化rdd

scala - 从 RDD 中删除常量列并计算协方差矩阵

database - 在 application.conf 中为 Play 2.0/anorm 加密数据库密码

scala - 不动点理论和 isGoodEnough 函数

sorting - 如何在 Scala 中对数组进行排序?

scala - 使用全局对象或参数来传递配置数据,Scala 中哪一个更好?

apache-spark - 如何在 PySpark 中使用 Spark 的 registerDataFrameAsTable?

python - 使用pyspark中的函数进行行操作

scala - Spark Streaming中foreach和foreachRDD有什么区别