Pyspark rdd.zip ValueError:无法反序列化具有不同成对项目数的 RDD

Posted

技术标签:

【中文标题】Pyspark rdd.zip ValueError:无法反序列化具有不同成对项目数的 RDD【英文标题】:Pyspark rdd.zip ValueError: Can not deserialize RDD with different number of items in pair 【发布时间】:2016-10-26 04:05:27 【问题描述】:

我正在使用 spark 1.6.0,并且我有一个 pyspark.mllib.tree.RandomForestModel 用于预测任务。我的data_rdd格式如下:

[LabeledPoint(id1,feature),
 LabeledPoint(id2,feature),
...]

我的代码是

rfmodel = RandomForestModel.load(sc,modelpath)

我想要的是获取 id 和预测的标签。所以我做了以下,

predictions = rfmodel.predict(data_rdd.map(lambda x:x.features))
idsAndPredictions = data_rdd.map(lambda lp: lp.label).zip(predictions)

我运行这段代码,它给出了一个错误

ValueError: Can not deserialize RDD with different number of items in pair: (91, 90)

由于 zip 功能而发生错误。似乎人们因为没有相同长度的 data_rdd 和预测而得到这个错误。但就我而言,data_rdd 和 predictions 显然具有相同的长度。

我的问题是如何让它工作,如果它是一个火花错误,还有其他方法可以达到相同的结果吗?

【问题讨论】:

能否请您提供预测和 data_rdd.map(lambda lp: lp.label) 的长度,因为从代码看来它们的长度不同 @ShivanshSrivastava 感谢您的回复。就我而言,预测来自 data_rdd 的逐行映射操作。所以我不认为它们的长度不同。我的数据由数亿个样本组成,因此可能需要一段时间才能分别计算它们。当然,我会考虑这种可能性并稍后提供计数。再次感谢您的建议。 看看link 【参考方案1】:

奇怪的是,我通过将分区数量从默认的大约 500000 个减少到 500 个来使其工作。希望有人能启发我。

【讨论】:

以上是关于Pyspark rdd.zip ValueError:无法反序列化具有不同成对项目数的 RDD的主要内容,如果未能解决你的问题,请参考以下文章

PYSPARK:如何将带有多个 case 语句的 SQL 查询转换为 Pyspark/Pyspark-SQL?

pyspark.sql.functions.col 和 pyspark.sql.functions.lit 之间的 PySpark 区别

Pyspark 安装错误:没有名为“pyspark”的模块

Pyspark:将 sql 查询转换为 pyspark?

Pyspark - ImportError:无法从“pyspark”导入名称“SparkContext”

Pyspark:基于所有列减去/差异 pyspark 数据帧