Итерация по спискам 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[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] смешанного типа с различными типизированными списками.,Как перебрать и сжать это? [Любой], кажется, не поддается картографированию / архивированию. Мне нужно взять N списков, сгенерированных определениями inputFile, а затем сохранить их в CSV-файл. Окончательный результат должен быть:
ColA, ColB
0.24455154, 1
0.108798146, 9
0.111522496, 3
... etc
Затем inputFile может быть использован для создания любого количества "colnames" любого "типа данных" (у меня есть сценарии для этого), каждого типа, встречающегося 1: n раз, любого числа строк (определенных как "elems"). Мои произвольно генерирующие скрипты настраивают значения для "начала" и "конца", но эти столбцы не имеют отношения к этому вопросу).
2 ответа
Учитывая 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()
методы могут выполнять то, что вы хотите.
Пожалуйста, обратитесь к официальной документации для получения дополнительной информации. надеюсь, это поможет вам