我有一个包含两列col1
和col2
的DataFrame(Spark 2.2.0和Scala 2.11)。我需要按以下格式创建一个新列:
=path("http://mywebsite.com/photo/AAA_BBB.jpg", 1)
其中AAA
是col1
的值,BBB
是给定行的col2
的值。
问题在于我不知道如何正确处理"
。我试过这个:
df = df.withColumn($"url",=path("http://mywebsite.com/photo/"+col("col1") + "_"+col("col2")+".jpg", 1))"
更新
现在编译好了,但是列值没有插入字符串中。我会看到文字col1
和col2
。
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)
答案 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)