【问题标题】:Comparing Column Object Values in Spark with Scala将 Spark 中的列对象值与 Scala 进行比较
【发布时间】:2021-02-02 04:40:18
【问题描述】:

我正在 Scala 中编写接受 Column 参数并返回一列的方法。在其中,我希望使用类似于下面的逻辑来比较列的值(从整数到日期),但遇到了错误消息。

lit() 仅用于示例目的。事实上,我正在将DataFrame.select() 中的列传递给一种计算方法。我需要使用这些列进行比较。

val test1 = lit(3)
val test2 = lit(4)

if (test1 > test2) { 
    print("tuff")
}

错误信息。

Error : <console>:96: error: type mismatch;
 found   : org.apache.spark.sql.Column
 required: Boolean
       if (test1 > test2) {

在 Spark 中比较 Column 对象的正确方法是什么? documentation 列将 &gt; 运算符列为对比较有效。

编辑:这是一个非常人为的用法示例,假设传递给函数的列是出于业务原因需要与返回的整数值进行比较的日期,该整数值也具有一定的业务意义。

someDataFrame.select(
   $"SomeColumn", 
   computedColumn($"SomeColumn1", $"SomeColumn2").as("MyComputedColumn")
)

computedColumn 在哪里

def computedColumn(col1 : Column, col2: Column) : Column = { 
      val returnCol : Column = lit(0)    
      if (col1 > col2) { 
         returnCol = lit(4)
      } 
} 

除了实际使用之外,computedColumn 中还需要执行更多 if/else 逻辑,最终结果是返回的 Column,它将添加到选择的输出中。

【问题讨论】:

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


    【解决方案1】:

    可以使用when进行条件比较:

    someDataFrame.select(
       $"SomeColumn", 
       when($"SomeColumn1" > $"SomeColumn2", 4).otherwise(0).as("MyComputedColumn")
    )
    

    如果你更喜欢写一个函数:

    def computedColumn(col1 : Column, col2: Column) : Column = { 
        when(col1 > col2, 4).otherwise(0)
    } 
    
    someDataFrame.select(
       $"SomeColumn", 
       computedColumn($"SomeColumn1", $"SomeColumn2").as("MyComputedColumn")
    )
    

    【讨论】:

    • 这当然是我可以实现的,但是真的没有办法在 Column 对象类型上使用传统的 Scala if/else/else if 逻辑吗?我将要实现的逻辑将变得非常健壮(6-7 个条件),我担心未来何时/否则格式的可读性。我曾想过可能会做 Column.toString().toWhateverDataType 但这似乎有点 hacky。
    • @Godwin 如果您使用 Spark,则需要习惯 Spark 语法。对我来说,使用when/otherwiseif/else 更具可读性,只是因为我已经习惯了。如果您要使用大数据和 Spark,这就是前进的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多