【问题标题】:spark - conditinal statements inside selectspark - select 中的条件语句
【发布时间】:2019-03-09 20:48:26
【问题描述】:

我从 Dataframe col1col2 中选择两个 Columns。

df.select((col("a")+col("b")).as("sum_col")

现在用户希望此 sum_col 固定为 4 个空格。 所以ab 的长度是2,因此最大值可以小于100(两个)或大于100(三个),所以需要有条件地添加1或2个空格。

谁能告诉我如何在 select 块内使用 cinditional 逻辑将 Column 转换为 concat 并决定添加一两个空格

【问题讨论】:

  • 请重写您的问题,因为不清楚或很难理解您的要求是什么

标签: scala apache-spark hadoop bigdata


【解决方案1】:

只需使用format_string 函数

import org.apache.spark.sql.functions.format_string

val df = Seq(1, 10, 100).toDF("sum_col")
val result = df.withColumn("sum_col_fmt", format_string("%4d", $"sum_col"))

证明它有效:

result.withColumn("proof", concat(lit("'"), $"sum_col_fmt", lit("'"))).show
// +-------+-----------+------+
// |sum_col|sum_col_fmt| proof|
// +-------+-----------+------+
// |      1|          1|'   1'|
//|     10|         10|'  10'|
// |    100|        100|' 100'|
// +-------+-----------+------+

【讨论】:

    【解决方案2】:

    带有 String.format 的 UDF:

    val df = List((1, 2)).toDF("a", "b")
    
    val leadingZeroes = (value: Integer) => String.format("%04d", value)
    val leadingZeroesUDF = udf(leadingZeroes)
    
    val result = df.withColumn("sum_col", leadingZeroesUDF($"a" + $"b"))
    
    result.show(false)
    

    输出:

    +---+---+-------+
    |a  |b  |sum_col|
    +---+---+-------+
    |1  |2  |0003   |
    +---+---+-------+
    

    【讨论】:

      【解决方案3】:

      定义一个UDF,然后注册它。我在格式前面添加了一个点,以便它可以显示在输出中。看看这个

      scala> import org.apache.spark.sql.functions._
      import org.apache.spark.sql.functions._
      
      scala> val df = spark.range(1,20).toDF("col1")
      df: org.apache.spark.sql.DataFrame = [col1: bigint]
      
      scala>  val df2 = df.withColumn("newcol", 'col1 + 'col1)
      df2: org.apache.spark.sql.DataFrame = [col1: bigint, newcol: bigint]
      
      scala> def myPadding(a:String):String =
           | return ".%4s".format(a)
      myPadding: (a: String)String
      
      scala> val myUDFPad = udf( myPadding(_:String):String)
      myUDFPad: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,StringType,Some(List(StringType)))
      
      scala> df2.select(myUDFPad(df2("newcol"))).show
      +-----------+
      |UDF(newcol)|
      +-----------+
      |      .   2|
      |      .   4|
      |      .   6|
      |      .   8|
      |      .  10|
      |      .  12|
      |      .  14|
      |      .  16|
      |      .  18|
      |      .  20|
      |      .  22|
      |      .  24|
      |      .  26|
      |      .  28|
      |      .  30|
      |      .  32|
      |      .  34|
      |      .  36|
      |      .  38|
      +-----------+
      
      
      scala>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2013-09-21
        • 2019-03-18
        • 2018-09-10
        • 2016-06-03
        • 2014-06-14
        • 2011-05-09
        相关资源
        最近更新 更多