Spark:加入待转换的数据集时,“SparkException:Task not serializable”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark:加入待转换的数据集时,“SparkException:Task not serializable”相关的知识,希望对你有一定的参考价值。

我有以下代码。它在两个Datasets上执行连接操作,其中一个在join转换中被过滤。

activeUserProfileDataset.join(
      allJobModelsDataset.filter(jobModel => jobIdRecCandidatesBroadcasted.value.contains(jobModel.JobId)),
      $"notVisitedJobId" === col(JobModelFieldNames.jobId),
      "left_outer")

这导致了问题:

SparkException:任务不可序列化

然而,当我拿出filter变换并在Dataset之外创建第二个join时,这个时间有效:

val jobIdRecCandidatesJobModels = allJobModelDataset.filter(jobModel => jobIdRecCandidatesBroadcasted.value.contains(jobModel.JobId))

val userJobPredictionsDataset3 = userJobPredictionsDataset2.join(
      jobIdRecCandidatesJobModels,
      $"notVisitedJobId" === col(JobModelFieldNames.jobId),
      "left_outer") 

你能解释一下这是为什么吗?你能告诉我这些转换操作(如join,filter)是如何在内部工作的吗?谢谢!

答案

这是因为在Spark中,您无法在其他转换中指定转换。主要思想:

  • 驱动程序节点处理DAG并创建任务
  • 工人执行转换(以任务的形式)

在第一个示例中,您尝试处理DAG并在转换内创建任务(在工作节点上)。通常,您需要创建一个需要在另一个DF上创建任务的任务。但请记住 - 工人无法创造新任务。他们只执行它们。

在第二个示例中 - 您在驱动程序节点上正确执行所有操例如。首先在DF上创建转换,然后在新任务中使用生成的DF。

希望有帮助:)

以上是关于Spark:加入待转换的数据集时,“SparkException:Task not serializable”的主要内容,如果未能解决你的问题,请参考以下文章

Spark 2.1 在读取大量数据集时挂起

Spark 无法读取 CSV 文件并转换为数据集

创建数据集时 Spark 无法反序列化记录

使用 Spark 编写数据集时,如何将驼峰式列名修改为带下划线的小写?

Spark 2.2 排序失败,数据集庞大

Spark DataFrame 空值到数据集