Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala中将数组[(Double,Double)]转换为数组[Double]?_Scala_Apache Spark_K Means_Apache Spark Mllib - Fatal编程技术网

如何在Scala中将数组[(Double,Double)]转换为数组[Double]?

如何在Scala中将数组[(Double,Double)]转换为数组[Double]?,scala,apache-spark,k-means,apache-spark-mllib,Scala,Apache Spark,K Means,Apache Spark Mllib,我正在使用Spark的MLlib(v1.1.0)和Scala对一个文件进行k-means聚类,该文件包含点(经度和纬度)。 我的文件包含4个用逗号分隔的字段(最后两个是经度和纬度) 这里是使用Spark的k-means聚类示例: 我要做的是读取HDFS中特定目录中文件的最后两个字段,将它们转换为RDDo在KMeans类中使用此方法: train(RDD数据、int k、int maxIterations) 这是我的代码: val data=sc.textFile(“/user/test/loc

我正在使用Spark的MLlib(v1.1.0)和Scala对一个文件进行k-means聚类,该文件包含点(经度和纬度)。 我的文件包含4个用逗号分隔的字段(最后两个是经度和纬度)

这里是使用Spark的k-means聚类示例:

我要做的是读取HDFS中特定目录中文件的最后两个字段,将它们转换为
RDD
o在KMeans类中使用此方法:
train(RDD数据、int k、int maxIterations)

这是我的代码:

val data=sc.textFile(“/user/test/location/*”)
val parsedData=data.map(s=>Vectors.densite(s.split(',')).map(fields=>(fields(2.toDouble,fields(3.toDouble)))

但当我在spark shell中运行它时,我得到以下错误:

错误:重载方法值,包含多个选项:(值: 数组[Double])org.apache.spark.mllib.linalg.Vector(第一个值: Double,othervalue:Double*)org.apache.spark.mllib.linalg.Vector 无法应用于(数组[(双精度,双精度)])


所以,我不知道如何将数组[(Double,Double)]转换为数组[Double]。也许有另一种方法可以读取这两个字段并将其转换为
RDD
,有什么建议吗?

对于密集向量有两种“工厂”方法:

def dense(values: Array[Double]): Vector
def dense(firstValue: Double, otherValues: Double*): Vector
虽然上面提供的类型是
Array[Tuple2[Double,Double]]
,因此类型不匹配:
(提取上面的逻辑:)

这里需要的是从输入字符串中创建一个新数组,如下所示:(再次只关注特定的解析逻辑)

将其集成到原始代码中可以解决以下问题:

val data = sc.textFile("/user/test/location/*")
val vectors = data.map(s => Vectors.dense(parseLineToArray(s))

(当然,您可以内联该代码,我在这里将其分隔开以关注当前的问题)

以前使用flatMap的建议是基于这样的假设,即您希望映射到.split(“,”)给定的数组元素,并通过使用数组而不是Tuple2来满足类型

.map/.flatMap函数接收的参数是原始集合的一个元素,因此为了清晰起见,应将其命名为“field”(singluar)。调用字段(2)选择拆分的每个元素的第3个字符-因此是混淆的来源

如果要查找的是.split(“,”)数组的第3和第4个元素,请将其转换为Double:

s.split(",").drop(2).take(2).map(_.toDouble)
或者,如果希望将除第一个外的所有to字段转换为双精度字段(如果可能有两个以上):


我已经这样做了,但不起作用。我的文件的一个例子是:point1,green,30.6894754264,-17.543308253,但是当我应用上面的代码时,结果是:
parsedData.take(1)Array[org.apache.spark.mllib.linalg.Vector]=Array([108.0,97.0108.0,97.0,46.0,54.0,55.0,46.0])
就像它获取我文件的每个字段,然后应用flatMap方法,从位置2到末尾获取字符,然后将它们转换为双字符。我需要的是只获取文件的最后两个字段。
val data = sc.textFile("/user/test/location/*")
val vectors = data.map(s => Vectors.dense(parseLineToArray(s))
val parsedData = data.map(s => Vectors.dense(s.split(',').flatMap(fields => Array(fields(2).toDouble,fields(3).toDouble))))
s.split(",").drop(2).take(2).map(_.toDouble)
s.split(",").drop(2).map(_.toDouble)