如何在scala中为concat的两列设置字符串,但按字母顺序排列结果列?

8fsztsew  于 2021-05-26  发布在  Spark
关注(0)|答案(2)|浏览(288)

我有一个这样的Dataframe。。。

val new_df =Seq(("a","b"),("b","a"),("a","c")).toDF("col1","col2")

我想创造 col3 “这是字符串串联” col1 “和” col2 ". 但是,我希望将“ab”和“ba”的串联处理为相同的,按字母顺序排序,这样它就只有“ab”。
生成的Dataframe如下所示:

val new_df =Seq(("a","b","ab"),("b","a","ab"),("a","c","ac")).toDF("col1","col2","col3")

还有一张前后的照片:
之前:

之后:

谢谢,祝你今天愉快!

smdnsysy

smdnsysy1#

使用spark sql函数可以利用spark sql优化:

import org.apache.spark.sql.functions.{sort_array, array, concat_ws}

new_df.withColumn("col3", 
  concat_ws("", 
    sort_array(array(col("col1"), col("col2")))))
jljoyd4f

jljoyd4f2#

你可以创建一个 udf 创建排序字符串

val concatColumns = udf((c1: String, c2: String) => {
    List(c1, c2).sorted.mkString
  })

然后把它用在 withColumn 语句发送要连接的所需列

new_df.withColumn("col3", concatColumns($"col1", $"col2")).show(false)

结果

+----+----+----+
    |col1|col2|col3|
    +----+----+----+
    |a   |b   |ab  |
    |b   |a   |ab  |
    |a   |c   |ac  |
    +----+----+----+

相关问题