繁体   English   中英

如何将双打数组数组转换为RDD [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])

但我有两个问题:

  • 你为什么要这样做? 我明白这只是因为你正在学习,而你正在玩Spark。
  • 为什么要尝试使用“数组”? 这不是我第一次看到人们尝试转换所有数组。 将RDD保留到最后并使用更多通用集合类型。

为什么您的代码错误:因为您在本地数组中应用了地图(在驱动程序中),然后从列表列表中创建RDD。 所以:

  • 您没有并行化地图的执行。 事实上,你没有任何并行化。
  • 您创建列表的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM