![](/img/trans.png)
[英]How to convert RDD[(String, String)] into RDD[Array[String]]?
[英]How to convert an array of array of Doubles to an RDD[String]
我需要将一个Array[Array[Double]]
转换为RDD
,例如[[1.1, 1.2 ...], [2.1, 2.2 ...], [3.1, 3.2 ...], ...]
+-----+-----+-----+ | 1.1 | 1.2 | ... | | 2.1 | 2.2 | ... | | 3.1 | 3.2 | ... | | ... | ... | ... | +-----+-----+-----+
val testDensities: Array[Array[Double]] = Array(Array(1.1, 1.2), Array(2.1, 2.2), Array(3.1, 3.2))
val testData = spark.sparkContext
.parallelize(Seq(testDensities
.map { x => x.toArray }
.map { x => x.toString() } ))
并且这段代码甚至感觉不正确,第二个map调用应该映射数组中的每个元素以将Double转换为String。 这是我将其保存为文本文件时得到的结果。
[Ljava.lang.String;@773d7a60
任何人都可以评论我该怎么办,以及我在哪里犯了一个可怕的错误?
谢谢。
如果要将Array [Double]转换为String,可以使用mkString方法,该方法使用分隔符(在我的示例中为","
)连接数组的每个项目
scala> val testDensities: Array[Array[Double]] = Array(Array(1.1, 1.2), Array(2.1, 2.2), Array(3.1, 3.2))
scala> val rdd = spark.sparkContext.parallelize(testDensities)
scala> val rddStr = rdd.map(_.mkString(","))
rddStr: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[7] at map at
scala> rddStr.collect.foreach(println)
1.1,1.2
2.1,2.2
3.1,3.2
也许是这样的:
scala> val testDensities: Array[Array[Double]] = Array(Array(1.1, 1.2), Array(2.1, 2.2), Array(3.1, 3.2))
scala> val strRdd = sc.parallelize(testDensities).map(_.mkString("[",",","]"))
strRdd: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[16] at map at <console>:26
scala> strRdd.collect
res7: Array[String] = Array([1.1,1.2], [2.1,2.2], [3.1,3.2])
但我有两个问题:
为什么您的代码错误:因为您在本地数组中应用了地图(在驱动程序中),然后从列表列表中创建RDD。 所以:
如果您在控制台中执行代码:
scala> val testData = sc.parallelize(Seq(testDensities.map { x => x.toArray }.map { x => x.toString() } ))
testData: org.apache.spark.rdd.RDD[Array[String]] = ParallelCollectionRDD[14] at parallelize at <console>:26
响应很明确: RDD[Array[String]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.