为什么我在 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的key不是String,是Tuple(String, Int)
这是因为您在 .toMap
方法之前有 zipWithIndex:
将此 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
首先,我读取了一个文本文件并将其转换为 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的key不是String,是Tuple(String, Int)
这是因为您在 .toMap
方法之前有 zipWithIndex:
将此 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