>

스칼라에서 두 텍스트를 비교하고 유사도를 계산하고 싶습니다. 나는 이것을 가지고 있지만 for 루프에서 평균값을 계산하는 데 성공하지 못했습니다. 나는 스칼라를 처음 사용하는데 루프에서 어떻게해야할지 모르겠다

import org.apache.spark._
import org.apache.spark.SparkContext._
object WordCount {
    def main(args: Array[String]):Unit = {
        val conf = new SparkConf().setAppName("WordCount")
        val sc = new SparkContext(conf)
        val wordCounts1 = sc.textFile("/chatblanc.txt"). //The white cat is eating a white soup
        flatMap(_.split("\\W+")).
            map((_, 1)).
            reduceByKey(_ + _)
            wordCounts1.collect.foreach(println)
           //Res : (is,1)                                                                          
           (eating,1)
           (cat,1)
           (white,2)
           (The,1)
           (soup,1)
           (a,1)
    print("======= End first file ========\n")
    val wordCounts2 = sc.textFile("/chatnoir.txt").
     //The black cat is eating a white sandwich
    flatMap(_.split("\\W+")).
        map((_, 1)).
        reduceByKey(_ + _)
        wordCounts2.collect.foreach(println)
        // Res2 : (is,1)                                                                          
        (eating,1)
        (cat,1)
        (white,1)
        (The,1)
        (a,1)
        (sandwich,1)
        (black,1)
    print("======= End second file ========\n")
    print("======= Display similarity rate  ========\n")
    val result = for( (t1,t2) <- wordCounts1.cartesian(wordCounts2) if( t1._1==t2._1)) yield = (Math.min(t1._2,t2._2).toDouble/Math.max(t1._2,t2._2).toDouble)
                            result.collect.foreach(println) 
    //Res : 
    1.0
    1.0
    1.0
    0.5
    1.0
    1.0
    }       
}

마지막으로 원하는 것은이 6 개 값의 평균을 변수에 저장하는 것입니다.

제발 도와주세요?

  • 답변 # 1

    여기서 데카르트 제품이 필요하지 않습니다. 그냥 join :

    val rdd1 = sc.parallelize(Seq("The white cat is eating a white soup"))
      .flatMap(_.split("\\s+").map((_, 1.0)))
      .reduceByKey(_ + _)
    val rdd2 = sc.parallelize(Seq("The black cat is eating a white sandwich"))
      .flatMap(_.split("\\s+").map((_, 1.0)))
      .reduceByKey(_ + _)
    val comb =  rdd1.join(rdd2).mapValues { case (x, y) => x.min(y) / x.max(y) }
    
    

    이제 평균 values 를 원한다면  그리고 mean 에 전화 :

    comb.values.mean
    
    

  • 이전 mysql - SQL은 COUNT (및 GROUP BY?)를 사용하여 레코드를 제외하지 않고 SELECT에서 계산을 수행합니다
  • 다음 c# - 차단 모음에서 Take/TryTake와 Add/TryAdd의 차이점