【问题标题】:Make spark return tuple (StructType) from case expression without UDFs从没有 UDF 的案例表达式中生成 spark 返回元组(StructType)
【发布时间】:2021-04-14 16:16:53
【问题描述】:

我正在寻找(做了一些没有成功的测试)在不使用 UDF 的情况下从 case 语句返回一个元组 StructType,有什么办法吗?

用例是:我们有 2 列依赖于 CASE 表达式中的相同条件,因此我们看到 2 个选项:

  • 两次写入相同的条件,但返回不同的列(不需要)
  • 编写一次条件,但在每个 WHEN 上返回 2 个值,这可以通过我们随后拆分的元组来实现。

我知道它可以使用 UDF 来完成,但我们避免了 UDF,因为它被 spark 视为黑盒,因此它们不可优化,所以问题是:有没有办法让 CASE 语句返回多个值而不使用 UDFS?

类似于:

df = df.withColumn("tuple", expr(
"CASE WHEN <condition 1> THEN (value1,value2)
      WHEN <condition 2> THEN (value3,value4)
      ELSE (value5,value6)
"))

df = df.withColumn("col1",col("tuple")[0])
df = df.withColumn("col2",col("tuple")[1])

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    你可以使用array:

    df = df.withColumn(
        "tuple", 
        expr("""
            CASE WHEN <condition 1> THEN array(value1,value2)
                 WHEN <condition 2> THEN array(value3,value4)
                 ELSE array(value5,value6)
            END
       """)
    )
    
    df = df.withColumn("col1",col("tuple")[0])
    df = df.withColumn("col2",col("tuple")[1])
    

    但请注意,数组应该都是相同的类型,即value1value3value5 应该具有相同的类型,并且value2value4value6 也应该具有同类型。

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      相关资源
      最近更新 更多