我想要完成的是从mapPartitionsWithIndex中获取尽可能多的信息。
如果我尝试获取类似sc.appName的内容,则抛出NullPointerException。
如何从mapPartitionsWithIndex中获取尽可能多的信息?
- 我需要这个用于调试和查看处理RDD时实际发生的事情。例如,知道正在处理哪个csv文件以及哪个从属文件是有用的。我得到的所有解决方案都在mapPartitionsWithIndex之外。
答案 0 :(得分:2)
不,您无法将SparkContext
传递给执行者。 (SparkContext
不是Serializable
。)但您可以传递sc.appName
(或任何其他Serializable
值:
val appName = sc.appName
rdd.mapPartitions(p => Iterator(appName))
您还可以访问本地(执行者)环境,例如:
rdd.mapPartitions(p => Iterator(java.net.InetAddress.getLocalHost.getHostName))
您还提到了解正在处理哪个CSV文件。假设你的代码是这样的:
val rdd = sc.textFile(".../directory/*.csv")
rdd.mapPartitions { partition =>
partition.map { line =>
// What file is "line" from?
???
}
}
那时的问题无法回答。
在调用mapPartitions
之前,您可能能够找出属于哪个分区的内容。即使在执行程序上执行任何代码之前,这也是预定义的。 (查看HadoopRDD.scala中的代码。)但这需要您检查私有类(inputSplit
)的成员(HadoopPartition
)以及其他修补程序。最好不去那里。
相反,您应该使用sc.wholeTextFiles
:
val rdd = sc.wholeTextFiles(".../directory/*.csv")
rdd.flatMap { case (file, contents) =>
contents.split("\n", -1).map { line =>
// "line" is from "file"!
???
}
}