我们不能在 map 函数中使用 sparkContext 吗?

Posted

技术标签:

【中文标题】我们不能在 map 函数中使用 sparkContext 吗?【英文标题】:Can't we use sparkContext inside map function? 【发布时间】:2018-07-10 11:22:46 【问题描述】:

我正在尝试调用地图内的用户定义函数,如下所示,

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 读取文件。真正的原因是什么?是不是不能把上下文传递给map里面的函数?

【问题讨论】:

我猜那是不可能的 感谢 Ramesh 的评论。 【参考方案1】:

在高层次上,SparkSession 是允许驱动程序与执行程序通信的对象。相比之下,map 方法定义了一个将在 executor 上执行的函数,这意味着它必须被序列化,以便 executor 可以获取相关数据并实际运行它。您可以想象将这个对象序列化给执行程序以供他们使用时可能出现的地狱般的情况。

在您的情况下,如果(我可以想象)路径数量相对适中(想想数百万或更少),您可以在驱动程序上收集这些路径,然后使用它们。 Spark 将根据需要安排此调用。

val paths: Array[String] = df.select.paths.as[String].collect()
for (path <- paths) 
  func1(sparkSession, fs, path)

【讨论】:

以上是关于我们不能在 map 函数中使用 sparkContext 吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用 folium.Map() 函数在地图中标记值列表?

为啥我们不能在 Array.map() 中使用扩展运算符,还有啥可以替代展平数组? [复制]

为啥我不能在函数中返回计算出的距离(来自 Google Maps API)? [复制]

python3 与Python2中map()函数的使用异同

STL库之map映射基础知识

为啥我不能在 Laravel 上正确映射嵌套查询? “在 null 上调用成员函数 map()”显示为错误