【问题标题】:Scala: For loop on dataframe, create new column from existing by indexScala:数据帧上的循环,从现有的索引创建新列
【发布时间】:2019-02-27 03:01:38
【问题描述】:

我有一个包含两列的数据框:

id(字符串),日期(时间戳)

我想遍历数据框,并添加一个带有 url 的新列,其中包括 id。该算法应如下所示:

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

我试图在 Scala 中完成这项工作,但在获取“a”索引上的特定 id 时遇到问题

 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。我还没有找到解决方案,所以欢迎各种建议!

【问题讨论】:

  • 你还需要一个循环吗? df2.withColumn("fileUrl", "https://someURL/" + $"id") 可能有用吗?
  • 您想添加与行一样多的列吗?这根本无法扩展,如果您不需要它可扩展,则没有理由使用 Spark DataFrame...
  • 所以@zacdav的解决方法抛出如下错误:error: type mismatch;发现:需要字符串:org.apache.spark.sql.Column 我在 Databricks 笔记本中工作,也许它以不同的方式工作?我也试着调查一下……
  • 顺便说一句,@eliasah,不,我只想添加一个带有 url 的列,其中 id 添加到链接中,id 来自第一列。
  • 那么你的伪代码是错误的,因为它就是这样做的。

标签: scala apache-spark for-loop calculated-columns databricks


【解决方案1】:

您可以在 Scala 中简单地使用 withColumn 函数,如下所示:

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

我的结果:

【讨论】:

    【解决方案2】:

    不确定这是否是您需要的,但您可以使用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|
    +---+---------------+----------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2021-07-23
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多