Scala: для цикла на фрейме данных создайте новый столбец из существующего по индексу - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть фрейм данных с двумя столбцами:

id (строка), дата (метка времени)

Я хотел бы просмотреть цикл данных и добавитьновый столбец с URL, который включает в себя идентификатор.Алгоритм должен выглядеть примерно так:

 add one new column with the following value:
 for each id
       "some url" + the value of the dataframe's id column

Я пытался сделать эту работу в Scala, но у меня проблемы с получением определенного идентификатора для индекса "a"

 val k = df2.count().asInstanceOf[Int]
      // for loop execution with a range
      for( a <- 1 to k){
         // println( "Value of a: " + a );
         val dfWithFileURL = dataframe.withColumn("fileUrl", "https://someURL/" + dataframe("id")[a])

      }

Но этот

dataframe ("id") [a]

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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете просто использовать функцию withColumn в Scala, что-то вроде этого:

val df = Seq(
  ( 1, "1 Jan 2000" ),
  ( 2, "2 Feb 2014" ),
  ( 3, "3 Apr 2017" )
)
  .toDF("id", "date" )


// Add the fileUrl column
val dfNew = df
  .withColumn("fileUrl", concat(lit("https://someURL/"), $"id"))
  .show

Мои результаты:

scala results

0 голосов
/ 26 февраля 2019

Не уверен, что это то, что вам нужно, но вы можете использовать zipWithIndex для индексации.

data.show()

+---+---------------+
| Id|            Url|
+---+---------------+
|111|http://abc.go.org/|
|222|http://xyz.go.net/|
+---+---------------+   

import org.apache.spark.sql._
val df = sqlContext.createDataFrame(
data.rdd.zipWithIndex
.map{case (r, i) => Row.fromSeq(r.toSeq:+(s"""${r.getString(1)}${i+1}"""))},
    StructType(data.schema.fields :+ StructField("fileUrl", StringType, false))
)                            

Вывод:

df.show(false)

+---+---------------+----------------+
|Id |Url            |fileUrl         |
+---+---------------+----------------+
|111|http://abc.go.org/|http://abc.go.org/1|
|222|http://xyz.go.net/|http://xyz.go.net/2|
+---+---------------+----------------+
...