擅长:python、mysql、java
<p>在最近的项目中,我不得不做同样的事情。对pyspark每次必须读取sklearn模型的每一行应用udf的缺点是,这就是为什么它需要很长时间才能完成。我发现的最好的解决方案是在rdd上使用.mapPartitions或foreachPartition方法,这里有很好的解释</p>
<p><a href="https://github.com/mahmoudparsian/pyspark-tutorial/blob/master/tutorial/map-partitions/README.md" rel="nofollow noreferrer">https://github.com/mahmoudparsian/pyspark-tutorial/blob/master/tutorial/map-partitions/README.md</a></p>
<p>它的工作速度很快,因为它确保了没有洗牌,而且对于每个分区,pyspark只需读取模型并预测一次。因此,流程是:</p>
<ul>
<li>将数据框转换为RDD</li>
<li>将模型广播到节点,以便工人可以访问它</li>
<li>编写一个以interator(包含分区内所有行)为参数的udf函数</li>
<li>遍历行并创建一个适当的矩阵,其中包含您的特性(顺序问题)</li>
<li>打电话。只预测一次</li>
<li>回报预测</li>
<li>如果需要,将rdd转换为df</li>
</ul>