加入 RDD leftOuterJoin - 错误:类型不匹配

Posted

技术标签:

【中文标题】加入 RDD leftOuterJoin - 错误:类型不匹配【英文标题】:Joining RDD leftOuterJoin - error: type mismatch 【发布时间】:2021-06-17 02:52:47 【问题描述】:

尝试使用 leftOuterJoin 连接两个不同大小的 RDD。已经使用其他类似的 RDD 进行了管理,但由于某种原因,我现在收到此错误:

type mismatch;
[error]  found   : org.apache.spark.rdd.RDD[(Int, Int, Double, Double, AnyVal)]
[error]  required: org.apache.spark.rdd.RDD[(Int, ?)]

带有指向对象 userScaleBack 的箭头(具有“找到”错误的结构):

val userProdItemScale = itemAverages.leftOuterJoin(userScaleBack)

如您所见,该对象包含元组和 5 个元组,它们的计数分别为 1650 和 80000。最左边元素中的所有值都在两个对象之间共享,因此 ? 值应该只连接到leftOuterJoin 匹配的较大对象中的所有位置。对象的内容如下所示:

userScaleBack
(1053,451,2.7362637362637363,0.011609034023077685,2.2637362637362637)
(466,451,2.7362637362637363,0.052013404418021464,2.2637362637362637)

itemAverages
(1053,3.473684210526316)
(466,3.4390243902439024)

【问题讨论】:

【参考方案1】:

您需要将userScaleBack 的类型更改为RDD[(Int, ?)],即具有两个元素的元组的RDD。您可以使用keyBy 来执行此操作:

val userProdItemScale = itemAverages.leftOuterJoin(userScaleBack.keyBy(_._1))

【讨论】:

谢谢,但后来我失去了 userScaleBack 的想法。我想避免丢弃所有其他值。可以对不同大小的类似对象执行此操作,因此我认为它们不需要具有相同的元组大小或计数即可工作 这些值不会被丢弃。它们将作为 4 元组保存在第二个元素中。我不认为它适用于不同大小的对象......你能举一个例子来说明它适用于不同大小的对象吗? 是的,我将编辑我的问题并将其添加到底部

以上是关于加入 RDD leftOuterJoin - 错误:类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

不可散列的类型:加入 PySpark RDD 时的“列表”

Spark - LeftOuterJoin 结果条数与左表条数不一致

RDD Join相关API,以及程序

如何将三个 RDD 加入一个元组?

spark:根据另一个 rdd 的序列加入 rdd

加入两个流水线RDD