Как написать вложенный для циклов эффективным способом в Scala? - PullRequest
0 голосов
/ 30 октября 2018

Я работаю над сценарием, где мне нужно иметь вложенные циклы. Я могу получить желаемый результат, но подумал, что, возможно, есть и лучший способ добиться этого.

У меня есть образец DF и я хотел получить вывод в следующем формате

List(/id=1/state=CA/, /id=2/state=MA/, /id=3/state=CT/)

Ниже приведен фрагмент кода, но любое предложение улучшит его.

Пример:

val stateDF = Seq(
 (1, "CA"),
 (2, "MA"),
 (3, "CT")
).toDF("id", "state")

 var cond = ""
 val columnsLst =List("id","state")
 var pathList = List.empty[String]

for (row <- stateDF.collect) {
   cond ="/"
   val dataRow = row.mkString(",").split(",")
   for (colPosition <- columnsLst.indices) {
      cond = cond + columnsLst(colPosition) + "=" + dataRow(colPosition) + "/"
   }
   pathList = pathList ::: List(cond)
}
println(pathList)

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Спасибо за все предложения. Теперь я подхожу ниже для моего вышеупомянутого требования.

import org.apache.spark.sql.{DataFrame}
val stateDF = Seq(
(1, "CA"),
(2, "MA"),
(3, "CT")
).toDF("id", "state")

val allStates = stateDF.columns.foldLeft(stateDF) {
  (acc: DataFrame, colName: String) =>
    acc.withColumn(colName, concat(lit("/" + colName + "="), col(colName)))
}
val dfResults = allStates.select(concat(allStates.columns.map(cols => col(cols)): _*))
val columnList: List[String] = dfResults.map(col => col.getString(0) + "/").collect.toList
println(columnList)
0 голосов
/ 31 октября 2018

Вы можете преобразовать dataframe в нужный вам формат, и, если необходимо, сделать collect позже, вот пример кода:

scala> stateDF.select(concat(lit("/id="), col("id"),lit("/state="),  col("state"), lit("/")).as("value")).show
+---------------+
|          value|
+---------------+
|/id=1/state=CA/|
|/id=2/state=MA/|
|/id=3/state=CT/|
+---------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...