遍历混合类型scala列表



使用 Spark 2.1.1.,我有一个 N 行 csv 作为 'fileInput'

colname datatype    elems   start   end
colA    float       10      0       1
colB    int         10      0       9

我已经成功地制作了一个sql.rows数组...

val df = spark.read.format("com.databricks.spark.csv").option("header", "true").load(fileInput)
val rowCnt:Int = df.count.toInt
val aryToUse  = df.take(rowCnt)
Array[org.apache.spark.sql.Row] = Array([colA,float,10,0,1], [colB,int,10,0,9])

针对这些行并使用我的随机值生成器脚本,我已成功填充了一个空的 ListBuffer[任何] ...

res170: scala.collection.mutable.ListBuffer[Any] = ListBuffer(List(0.24455154, 0.108798146, 0.111522496, 0.44311434, 0.13506883, 0.0655781, 0.8273762, 0.49718297, 0.5322746, 0.8416396), List(1, 9, 3, 4, 2, 3, 8, 7, 4, 6))

现在,我有一个混合类型的ListBuffer[Any],其中包含不同的类型列表。.如何循环访问和压缩这些内容? [任何]似乎无视映射/压缩。 我需要获取由inputFile的定义生成的N个列表,然后将它们保存到csv文件中。 最终输出应为:

ColA, ColB
0.24455154, 1
0.108798146, 9
0.111522496, 3
... etc

然后,inputFile 可用于创建任意数量的"colnames",任何"数据类型"(我有脚本(,每种类型出现 1::n 次,任意数量的行(定义为"elems"(。 我的随机生成脚本自定义每个"开始"和"结束"的值,但这些列与此问题无关(。

>给定一个List[List[Any]],如果你不介意结果是列表列表而不是元组列表,您可以使用transpose将所有这些列表"压缩"在一起:

val result: Seq[List[Any]] = list.transpose

如果你想把它写到CSV中,你可以从将每个"行"映射到一个逗号分隔的字符串开始:

val rows: Seq[String] = result.map(_.mkString(","))

(注意:我忽略了Apache Spark部分,这似乎与这个问题完全无关..."元数据"是通过 Spark 加载的,但随后它被收集到一个数组中,因此它变得无关紧要(

我认为

RDD.zipWithUniqueId()RDD.zipWithIndex()方法可以执行您想要执行的操作。

有关详细信息,请参阅官方文档。 希望对您有所帮助

最新更新