我有以下代码。它在两个Dataset
上执行连接操作,其中一个在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)是如何在内部工作的吗? 谢谢!
答案 0 :(得分:0)
这是因为在Spark中,您无法在其他转换中指定转换。 主要想法:
在第一个示例中,您尝试处理DAG并在转换中创建任务(在工作节点上)。通常,您需要创建一个需要在另一个DF上创建任务的任务。但请记住 - 工人无法创造新任务。他们只执行它们。
在第二个示例中 - 您在驱动程序节点上正确执行所有操作。例如。首先在DF上创建转换,然后在新任务中使用生成的DF。
希望有所帮助:)