迭代混合类型scala列表

时间:2017-05-18 18:10:17

标签: scala list csv apache-spark listbuffer

使用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 [Any] ...

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]。 。 如何迭代并压缩这些? [Any]似乎无视映射/压缩。我需要获取inputFile定义生成的N个列表,然后将它们保存到csv文件中。最终输出应为:

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

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

2 个答案:

答案 0 :(得分:2)

鉴于List[List[Any]],您可以"压缩"所有这些列表使用transpose一起使用,如果您不介意结果是列表列表而不是元组列表:

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

如果您想将其写入CSV,您可以先映射每个"行"到逗号分隔的字符串:

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

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

答案 1 :(得分:-1)

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

有关详细信息,请参阅official documentation。希望这能帮到你