流式K-means Spark Scala:获取输入字符串的java.lang.NumberFormatException

流式K-means Spark Scala:获取输入字符串的java.lang.NumberFormatException,scala,streaming,spark-streaming,k-means,Scala,Streaming,Spark Streaming,K Means,当我从包含双值的目录中读取CSV数据并在其上应用流式K-means模型时,如下所示 //CSV文件 40.729,-73.9422 40.7476,-73.9871 40.7424,-74.0044 40.751,-73.9869 40.7406,-73.9902 //SBT相关性: 名称:=“应用程序名称” 版本:=“0.1” 规模规避:=“2.11.12” val sparkVersion=“2.3.1” libraryDependencies++=Seq( “org.apache.spa

当我从包含双值的目录中读取CSV数据并在其上应用流式K-means模型时,如下所示

//CSV文件

40.729,-73.9422
40.7476,-73.9871
40.7424,-74.0044
40.751,-73.9869
40.7406,-73.9902

//SBT相关性:

名称:=“应用程序名称”

版本:=“0.1”

规模规避:=“2.11.12”
val sparkVersion=“2.3.1”

libraryDependencies++=Seq(
“org.apache.spark”%%“spark核心”%sparkVersion,
“org.apache.spark”%”spark-streaming_2.11“%sparkVersion,
“org.apache.spark”%%“spark mllib”%%“2.3.1”)

//进口声明

导入org.apache.spark.sql.{DataFrame,SparkSession}
导入org.apache.spark.sql.streaming.OutputMode
导入org.apache.spark.sql.types.\ubr> 导入org.apache.spark.{SparkConf,SparkContext,rdd}
导入org.apache.spark.streaming.{Seconds,StreamingContext}
导入org.apache.spark.mllib.clustering.{KMeans,StreamingKMeans}
导入org.apache.spark.mllib.linalg.Vectors

//读取Csv数据

我得到以下错误:

18/07/24 11:20:04错误执行者:第2.0阶段任务0.0中出现异常 (工业贸易署) 1) java.lang.NumberFormatException:对于输入字符串:“40.7473,-73.9857” sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) 位于sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) java.lang.Double.parseDouble(Double.java:538)位于 scala.collection.immutable.StringLike$class.toDouble(StringLike.scala:285) 位于scala.collection.immutable.StringOps.toDouble(StringOps.scala:29) 在ubu$$anonfun$1.应用(uberclass.scala:305)在 ubu$$anonfun$1.apply(uberclass.scala:305)位于 scala.collection.Iterator$$anon$11.next(Iterator.scala:410)位于 scala.collection.Iterator$$anon$11.next(Iterator.scala:410)位于 scala.collection.Iterator$$anon$11.next(Iterator.scala:410)位于 org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:193) 在 org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:63) 在 org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96) 在 org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53) 位于org.apache.spark.scheduler.Task.run(Task.scala:109) org.apache.spark.executor.executor$TaskRunner.run(executor.scala:345) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 线程中的java.lang.Thread.run(Thread.java:748)异常 “streaming-job-executor-0”java.lang.Error: java.lang.InterruptedException位于 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1155) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 运行(Thread.java:748)


有人能帮忙吗?

有一个维度问题。传递到流式K-均值模型的向量和数值维度的维度应相同

错误信息非常清楚,字符串
“40.7473,-73.9857”
不是数字。这是两个用逗号分隔的数字。您需要
拆分(“,”)
它。谢谢您的回复。@jwvh但在使用如下拆分函数后:`var trainingData=ssc.textFileStream(“目录路径”).map(x=>x.split(',').map(u.toDouble)).map(x=>Vectors.densite(x))`它给出了这个错误:
java.lang.IllegalArgumentException:requirement在scala.Predef$.require(Predef.scala:212)失败。
我只是猜测,但我怀疑您是否将正确的类型传递给了
Vectors.dense()
方法。你可以试试:
.map(uu.split(',).map(x=>Vectors.dense(x.toDouble))
@jwvh我按照你的建议做了。但是它会导致类型为Dstream[Array[vector]]的Dstream向量,这是流式K-均值的trainOn方法所不接受的。它需要DStream[Vector]类型的流数据predictOnValues中的结果正确吗?数据的维度:SetRandomCenter的第一个参数(它应该与功能的数量相同)
val trainingData = ssc.textFileStream ("directory path") 
                      .map(x=>x.toDouble)
                      .map(x=>Vectors.dense(x))
// applying Streaming kmeans model
val model = new StreamingKMeans()
  .setK(numClusters)
  .setDecayFactor(1.0)
  .setRandomCenters(numDimensions, 0.0)
model.trainOn(trainingData)