【问题标题】:Spark Dataframe size check on columns does not work as expected using vararg and if else - Scala使用 vararg 和 if else - Scala 对列的 Spark Dataframe 大小检查无法按预期工作
【发布时间】:2020-04-15 17:57:49
【问题描述】:

我不想在数据框中的所有列上使用 foldLeft 或 withColumn,但想要根据 https://medium.com/@manuzhang/the-hidden-cost-of-spark-withcolumn-8ffea517c015 进行选择,并使用 if else 语句和带有 vararg 的 cols 进行修饰。我想要的只是使用 Scala 替换 Spark 数据框中的空数组列。我正在使用大小,但它永远不会正确计算零 (0)。

val resDF2 = aggDF.select(cols.map { col =>
         ( if (size(aggDF(col)) == 0) lit(null) else aggDF(col) ).as(s"$col") 
                                   }: _*)

if (size(aggDF(col)) == 0) lit(null) 在功能上不起作用,但它确实运行并且 size(aggDF(col)) strong> 如果我返回,则返回正确的长度。

我想知道这个愚蠢的问题是什么。一定是我明显忽略的东西!

【问题讨论】:

    标签: dataframe apache-spark if-statement size


    【解决方案1】:

    if-else 不适用于 DataFrame API,这些用于 Scala 逻辑表达式。使用 DataFrames 你需要when/otherwise:

    val resDF2 = aggDF.select(cols.map { col => ( when(size(aggDF(col)) === 0,lit(null)).otherwise(aggDF(col))).as(s"$col") }: _*)
    

    这可以进一步简化,因为没有otherwisewhen 会自动返回null(即otherwise(lit(null)) 是默认值):

    val resDF2 = aggDF.select(cols.map { col => when(size(aggDF(col)) > 0,aggDF(col)).as(s"$col") }: _*)
    

    另见https://stackoverflow.com/a/48074218/1138523

    【讨论】:

    • 好的,谢谢。有趣的是它运行(不正确)。我找不到这个,但圣诞快乐。
    猜你喜欢
    • 2013-12-16
    • 2013-11-25
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2020-03-11
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多