如何在DataFrame的新列中正确格式化字符串?

时间:2017-11-30 09:39:48

标签: scala apache-spark spark-dataframe

我有一个包含两列col1col2的DataFrame(Spark 2.2.0和Scala 2.11)。我需要按以下格式创建一个新列:

=path("http://mywebsite.com/photo/AAA_BBB.jpg", 1)

其中AAAcol1的值,BBB是给定行的col2的值。

问题在于我不知道如何正确处理"。我试过这个:

df = df.withColumn($"url",=path("http://mywebsite.com/photo/"+col("col1") + "_"+col("col2")+".jpg", 1))"

更新

现在编译好了,但是列值没有插入字符串中。我会看到文字col1col2

,而不是列值
df = df.withColumn("url_rec",lit("=path('http://mywebsite.com/photo/"+col("col1")+"_"+col("col1")+".jpg', 1)"))

我明白了:

=path('http://mywebsite.com/photo/col1_col1.jpg', 1)

1 个答案:

答案 0 :(得分:0)

如评论中所述,您可以多次使用concat,例如:

d.show
+---+---+
|  a|  b|
+---+---+
|AAA|BBB|
+---+---+

d.withColumn("URL" , 
   concat(
       concat(
           concat(
               concat(lit("""=path("http://mywebsite.com/photo/""" ), $"a") ,
               lit("_") ) , $"b" 
           ) 
           , lit(""".jpg", 1) """) 
         ).as[String].first

// String = "=path("http://mywebsite.com/photo/AAA_BBB.jpg", 1) "

或者您可以映射数据框以附加新列(比concat方法更清晰)

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._

val urlRdd = d.map{ x => 
     Row.fromSeq(x.toSeq ++ Seq(s"""=path("http://mywebsite.com/photo/${x.getAs[String]("a")}_${x.getAs[String]("b")}.jpg", 1)""")) 
    }

val newDF = sqlContext.createDataFrame(urlRdd, d.schema.add("url", StringType) )

newDF.map(_.getAs[String]("url")).first
// String = =path("http://mywebsite.com/photo/AAA_BBB.jpg", 1)