【问题标题】:compare two strings in rdd scala and got exception Task not serializable比较rdd scala中的两个字符串并得到异常Task not serializable
【发布时间】:2017-11-30 15:25:30
【问题描述】:

我有两个字符串的 rdd JoindStrings: RDD[(String, String)] 我需要计算每对字符串之间的相似度 我试过这个:

val similarPairsRdd: RDD[(String, String, Double)] = 
    JoindStrings.map(x => (x._1, x._2, getSimilarity(x._1, x._2)))

函数getSimilarity 接受两个字符串并返回双精度 我在线程“main”中有一个异常

org.apache.spark.SparkException:任务不可序列化

另外,我尝试了JoindStrings.map.collect()(x => ...,但它给了我数组而不是 rdd 这个异常有解决办法吗?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    从名称来看,getSimilarity 可能不使用“主”类中的任何字段,但它仍然需要对其进行引用才能调用,因此 Spark 必须对其进行序列化。将其提取到单独的object。

    【讨论】:

      【解决方案2】:

      对于 RDD 上的操作,我认为函数 getSimilarity 需要是一个 UDF。使用 spark.functions._ 包创建 UDF。

      如果对Dataset进行操作,可以直接使用getSimilarity函数。

      val joindStrings : Dataset[(String, String)] = .. source of dataset 
      val similarPairsRdd  = joindStrings.map { x => (x._1, x._2, getSimilarity(x._1, x._2)) }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多