使用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' &安培; '结束',但这些列与此问题无关。)
答案 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。希望这能帮到你