簡體   English   中英

為什么我在Scala Spark中得到類型不匹配的信息?

[英]Why I get type mismatch in scala Spark?

首先,我讀取一個文本文件並將其轉換為RDD [(String,(String,Float))]:

val data = sc.textFile(dataInputPath);
val dataRDD:RDD[(String,(String,Float))] = data.map{f=> {
      val temp=f.split("//x01");
      (temp(0),(temp(1),temp(2).toInt ) );
      }
    } ;

然后,我運行以下代碼將我的數據轉換為評分類型

import org.apache.spark.mllib.recommendation.Rating
val imeiMap = dataRDD.reduceByKey((s1,s2)=>s1).collect().zipWithIndex.toMap;
val docidMap = dataRDD.map( f=>(f._2._1,1)).reduceByKey((s1,s2)=>s1).collect().zipWithIndex.toMap;
val ratings = dataRDD.map{case (imei, (doc_id,rating))=> Rating(imeiMap(imei),docidMap(doc_id),rating)};

但我得到一個錯誤:

Error:(32, 77) type mismatch;
 found   : String
 required: (String, (String, Float))
    val ratings = dataRDD.map{case (imei, (doc_id,rating))=> Rating(imeiMap(imei),docidMap(doc_id),rating)};

為什么會這樣? 我認為string已經更改為(String, (String, Float))

它與您的dataRDD ,而與imeiMap有關:

imeiMap: scala.collection.immutable.Map[(String, (String, Float)),Int] 

docidMap的鍵不是字符串,而是元組(String,Int)

這是因為您在.toMap方法之前擁有.toMap

使用此rdd作為快速測試的輸入:

(String1,( String2,32.0))
(String1,( String2,35.0))



scala> val docidMap = dataRDD.map( f=>(f._2._1,1)).reduceByKey((s1,s2)=>s1).collect().zipWithIndex.toMap;
docidMap: scala.collection.immutable.Map[(String, Int),Int] = Map((" String2",1) -> 0)


val docidMap = dataRDD.map( f=>(f._2._1,1)).reduceByKey((s1,s2)=>s1).collect().toMap;
docidMap: scala.collection.immutable.Map[String,Int] = Map(" String2" -> 1)     

您的imeiMap也會發生同樣的情況,似乎您也只需要從那里刪除zipWithIndex

val imeiMap = dataRDD.reduceByKey((s1,s2)=>s1).collect.toMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM