使用 Scala 将 Array[DenseVector] 转换为 CSV

Posted

技术标签:

【中文标题】使用 Scala 将 Array[DenseVector] 转换为 CSV【英文标题】:Convert Array[DenseVector] to CSV with Scala 【发布时间】:2018-06-13 16:37:07 【问题描述】:

我在 Scala 中使用 Kmeans Spark 函数,我需要将获得的集群中心保存到 CSV 中。这个 val 的类型是:Array[DenseVector]

val clusters = KMeans.train(parsedData, numClusters, numIterations)
val centers = clusters.clusterCenters

我试图将centers 转换为 RDD 文件,然后从 RDD 转换为 DF,但我遇到了很多问题(例如 import spark.implicits._ / SQLContext.implicits._ 不起作用,我无法使用.toDF)。我想知道是否有另一种方法可以使 CSV 更容易。

有什么建议吗?

【问题讨论】:

【参考方案1】:

无需使用外部库,您只需以 Java 方式写入文件即可。

import java.io. PrintWriter, File, FileOutputStream 

...

val pw = new PrintWriter(
    new File( "KMeans_centers.csv" )
)

centers
.foreach( vec =>
        pw.write( vec.toString.drop( 1 ).dropRight( 1 ) + "\n" )
    )

pw.close()

结果文件

0.1,0.1,0.1
9.1,9.1,9.1

需要dropdropRight来移除转换后的向量周围的[]

代码和数据取自官方example。

【讨论】:

以上是关于使用 Scala 将 Array[DenseVector] 转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章

scala 将 Array[String] 转换为案例类

Scala:将元素附加到数组的最佳方法是啥?

将 Scala 中的任何类型转换为 Array[Byte] 并返回

Scala 库将数字(Int、Long、Double)与 Array[Byte] 相互转换

将 Scala 的 K-means 应用于 rdd 的每个元素。

Todo转载Scala中Array, List, Tuple的区别