簡體   English   中英

帶有多個 case when 語句的 Spark-sql

[英]Spark-sql with multiple case when statements

我使用 mydf.createOrReplaceTempView("combine_table") 在 sparksql 中使用我的數據框創建了一個臨時表。所有字段數據類型都顯示為字符串。 在這個臨時表中,我有 4 列 procuredValue、minMargin、maxMargin、Price 和其他一些列。在所有這 4 列中,我都有 373.58...等值。 現在我需要根據某些條件選擇數據,並且必須將數據顯示為新列“最終價格”。 我正在嘗試使用 Case 語句執行此操作,但出現以下錯誤。 不匹配的輸入 '1st_case' 期望 EOF(第 3 行,位置 5) 誰能建議我應該如何執行此操作。

    val d1=spark.sql(""" SELECT cast(PV as  FloatType),cast(mxM as FloatType),
    cast(mnM as FloatType ) , cast(procuredValue+ mxM as FloatType) as 1st_case, 
    cast(PV+ mnM as FloatType) as 2nd_case,
    case 
    WHEN 1st_case < price THEN 1st_case
    WHEN 2ndcse < price THEN 2ndcse 
    WHEN PV <price && saleevent = 'Sp' THEN 'price'
    WHEN price < 'PV'  && saleevent = 'Sp' && sclass = 'VH' THEN 0.9* PV
    ELSE PV 
    END AS Final_price 
    FROM combine_table""")

您的查詢會發生什么?

SELECT *, 
       CASE 
              WHEN Sum(i.procuredvalue + i.maxmargin) < min_val_seller.q THEN Sum(i.procuredvalue + i.maxmargin)
              WHEN Sum(i.procuredvalue + i.maxmargin) < min_val_seller.q THEN min_val_seller.q 
              WHEN Sum(i.procuredvalue < min_val_seller.q) and e.saleevent = 'Special' THEN min_val_seller.q
              WHEN min_val_seller.q < i.procuredvalue and e.saleevent = 'Special' and Min(min_val_seller.q) and s.netvalue = 'VeryHigh' THEN 0.9*i.procuredvalue
              ELSE i.procuredvalue 
       END AS final_price 
  FROM ecom_competitor_data e, 
       internal_product_data i, 
       min_val_seller, 
       seller_data s 
 WHERE e.productid = i.productid 
   AND s.sellerid = i.sellerid

這么多問題...

  1. 您不能用雙引號將查詢括起來,也不能使用雙引號來限定其中的字符串(沒有適當的轉義)。
    更簡單、更干凈的解決方案是做這樣的事情:

——

val myquery = """
select ...
from ...
where ...
"""   

val 1st_case=spark.sql(myquery)

PS 習慣於對 SQL 字符串使用單引號。 與雙引號不同,它適用於所有 SQL 方言。

  1. 'min_val_seller.Q'是一個字符串文字

  2. Spark 中的邏輯 AND 是and ,而不是&&

  3. CASE 語句以兩個相同的條件( Sum(i.procuredvalue + i.maxmargin) < min_val_seller.q )開始。 永遠不會選擇第二個條件。

    (請確保您了解 CASE 的工作原理)

  4. ISO JOIN 是在 90 年代引入的。 沒有理由使用 WHERE 條件而不是正確的 JOIN 語法。

    val d1=spark.sql(""" SELECT price,PV,
    case
    WHEN cast(PV + mxM as Float) < cast(price as Float) THEN PV + mxM
    WHEN cast(PV + mnM as Float) < cast(price  as Float)THEN PV + mnM
    WHEN cast(PV as Float) < cast(price  as Float) And saleevent =     'Sp' THEN price
    WHEN cast(price as Float) < cast(PV as Float)  And saleevent =   'Sp' And sclass = "VH" THEN 0.9*PV
    ELSE PV
    END AS price
    FROM combine_table""");

謝謝@David 以上查詢對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM