【问题标题】:Concatenate multiple columns with if in spark scala在 spark scala 中使用 if 连接多列
【发布时间】:2020-09-01 04:54:10
【问题描述】:

我必须在 spark Scala 中使用条件连接多个列,但它不适用于“if”。 我有以下数据框:

table:
+---+----+----+  
|  a|   b|   c|
+---+----+----+  
|  0|   1|   1|
|  1|   0|   0|
|  1|   1|   0|
+---+----+----+

table.withColumn("concat", concat_ws(", ", (if($"a"===1){lit("D")} else{null}),
                                           (if($"b"===1){lit("E")} else{null}),
                                           (if($"c"===1){lit("F")} else{null})))

以下是最终要求的结果。

+---+----+----+------+ 
|  a|   b|   c|concat|
+---+----+----+------+  
|  0|   1|   1|  E, F|
|  1|   0|   0|     D|
|  1|   1|   0|  D, E|
+---+----+----+------+

我不会像这样创建其他列:

val ftable = (table.withColumn("D", when ($"a"===1, lit("D")))
                    .withColumn("E", when ($"b"===1, lit("E")))
                    .withColumn("F", when ($"c"===1, lit("F"))))                                 

val columnselection = ftable.select($"D", $"E" , $"F" )
val selection = columnselection.columns.map(col)
val animaliCol = ftable.select(ftable.col("*"), concat_ws(", ", selection : _*).as("concat"))

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您应该将if 替换为whenotherwise

     import org.apache.spark.sql.functions._
    
     table.withColumn("concat", concat_ws(", ",
          when($"a"===1,lit("D")).otherwise(null),
          when($"b"===1,lit("E")).otherwise(null),
          when($"c"===1,lit("F")).otherwise(null)
        )).show()
    

    输出:

    +---+---+---+------+
    |  a|  b|  c|concat|
    +---+---+---+------+
    |  0|  1|  1|  E, F|
    |  1|  0|  0|     D|
    |  1|  1|  0|  D, E|
    +---+---+---+------+
    

    【讨论】:

      【解决方案2】:

      使用 concat_wswhenotherwise 函数。

      scala> df.show(false)
      +---+---+---+
      |a  |b  |c  |
      +---+---+---+
      |0  |1  |1  |
      |1  |0  |0  |
      |1  |1  |0  |
      +---+---+---+
      
      

      创建所需的列及其默认值。

      scala> val expressions = concat_ws(", ",Seq(("a","D"),("b","E"),("c","F")).map(c => when(col(c._1) === 1, lit(c._2)).otherwise(null)):_*) // Create column names & its default values expressions.
      expressions: org.apache.spark.sql.Column = concat_ws(, , CASE WHEN (a = 1) THEN D ELSE NULL END, CASE WHEN (b = 1) THEN E ELSE NULL END, CASE WHEN (c = 1) THEN F ELSE NULL END)
      
      

      最终输出

      scala> df.withColumn("concat",expressions).show(false)
      +---+---+---+------+
      |a  |b  |c  |concat|
      +---+---+---+------+
      |0  |1  |1  |E, F  |
      |1  |0  |0  |D     |
      |1  |1  |0  |D, E  |
      +---+---+---+------+
      
      

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        • 2020-04-14
        • 2019-02-12
        • 2021-03-22
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多