我正在尝试如下调用map中的用户定义函数,
df.select("path").map(x => func1(sparkSession, fs, path))
def func1(sparkSession: SparkSession, fileSystem: FileSystem, path: String)
{
read HDFS file path and count the records.
}
使用上述方法时,我无法从HDFS读取文件。真正的原因是什么?不可能将上下文传递给地图内的函数吗?
答案 0 :(得分:1)
在较高级别上,SparkSession
是允许驱动程序与执行程序通信的对象。相比之下,map
方法定义了将在执行程序上执行的函数,这意味着必须对其进行序列化,以便执行程序可以与相关数据一起拾取并实际运行它。您可以想象将对象序列化到执行程序以供使用时可能发生的可怕情况。
在您的情况下,如果(如我所能想象的),路径的数量相对适中(请考虑数百万条或更少),则可以在驱动程序上收集它们,然后使用它们。 Spark将在必要时安排此次电话会议。
val paths: Array[String] = df.select.paths.as[String].collect()
for (path <- paths) {
func1(sparkSession, fs, path)
}