org.apache.spark.SparkException: Task not serializable

6 篇文章 0 订阅
5 篇文章 0 订阅

在spark shell中运行下述代码:

    val max_array = max_read_fav_share_vote.collect
    val max_read = max_array(0)(0).toString.toDouble
    val max_fav = max_array(0)(1).toString.toDouble
    val max_share = max_array(0)(2).toString.toDouble
    val max_vote = max_array(0)(3).toString.toDouble
    
    val id_hot = serviceid_read_fav_share_vote.map(x=>
    {
      val id = x.getString(0)
      val read = x.getLong(1).toDouble
      val fav = x.getLong(2).toDouble
      val share = x.getLong(3).toDouble
      val vote = x.getLong(4).toDouble

      val hot = 0.1 * (read/ max_read) + 0.2 * (fav/ max_fav) +0.3 * (share/ max_share) +0.4 * (vote/ max_vote)
      (id,hot)
     }).toDF("id","hot")

出现错误:
在这里插入图片描述
这是因为在map、filter中使用了外部的变量,而spark中任务的执行是需要将对象分布式传送到各个节点上去的。因为数据就分布式存储在各个节点上,因此传送之前需要将对象序列化,但是有些变量不能序列化。

解决方法是:
对于不能序列化的变量,就不进行传送,让其在各个节点上使用即可,将map改成使用mapPartitions等方法即可,代码修改为:

 val id_hot = serviceid_read_fav_share_vote.mapPartitions{
      partition =>
        partition.map{
            x=>
            {
              val id = x.getString(0)
              val read = x.getLong(1).toDouble
              val fav = x.getLong(2).toDouble
              val share = x.getLong(3).toDouble
              val vote = x.getLong(4).toDouble

              val hot = 0.1 * (read/max_read) + 0.2 * (fav/max_fav) + 0.3 * (share/max_share) +0.4 * (vote/max_vote)
              (id,hot)
            }
        }
    }.toDF("id","hot")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值