如何使用scala在spark sql中使用条件时写入case

pra*_*een 17 apache-spark-sql

SELECT c.PROCESS_ID, 
       CASE WHEN c.PAYMODE = 'M' 
           THEN 
               CASE WHEN CURRENCY = 'USD' 
                   THEN c.PREMIUM * c.RATE 
                   ELSE c.PREMIUM END * 12
           ELSE 
               CASE WHEN CURRENCY = 'USD' 
                   THEN c.PREMIUM * c.RATE 
                   ELSE c.PREMIUM END END VAlue
FROM CMM c
Run Code Online (Sandbox Code Playgroud)

我想转换sql查询spark sql api我该怎么办?

谢谢

Dav*_*fin 47

如果您正在寻找使用Column对象执行此操作的方法,您可以像这样进行字面翻译:

val df: DataFrame = ...

df.select(
  col("PROCESS_ID"),
  when(col("PAYMODE") === lit("M"),
    (when(col("CURRENCY") === lit("USD"), col("PREMIUM") * col("RATE"))
    .otherwise(col("PREMIUM"))) * 12
  ).otherwise(
    when(col("CURRENCY") === lit("USD"), col("PREMIUM") * col("RATE"))
    .otherwise(col("PREMIUM"))
  )
)
Run Code Online (Sandbox Code Playgroud)

然而,可能更简洁的做法是做类似的事情:

df.withColumn(
"result",
  when(col("CURRENCY") === lit("USD"), col("PREMIUM") * col("RATE"))
    .otherwise(col("PREMIUM"))
).withColumn(
  "result",
  when(col("PAYMODE") === lit("M"), col("result") * 12)
    .otherwise(col("result"))
)
Run Code Online (Sandbox Code Playgroud)

至少,第二个对我来说更容易阅读.

  • 欢迎你 - 随意接受我的回答`;-)` (12认同)