带有多个case when语句的Spark-sql

时间:2020-03-14 08:38:41

标签: sql apache-spark hive apache-spark-sql

我使用mydf.createOrReplaceTempView(“ combine_table”)在sparksql中使用数据框创建了一个临时表。所有字段数据类型都显示为字符串。 在这个临时表中,我有4列procuredValue,minMargin,maxMargin,Price和其他一些列。在所有这4列中,我都具有373.58等值。 现在,我需要根据某些条件选择数据,并且必须将数据显示为新列“最终价格”。我正在尝试使用Case语句执行此操作,但出现错误。 输入'1st_case'不匹配,预计会发生EOF(第3行,第5位) 谁能建议我该怎么做。

Hive.initFlutter('chosenPath')

3 个答案:

答案 0 :(得分:0)

查询会怎样?

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 :(得分:0)

这么多问题...

  1. 您不能在查询中用双引号引起来,也不能使用双引号来限定其中的字符串(没有适当的转义)。
    更简单,更清洁的解决方案是执行以下操作:

-

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

val 1st_case=spark.sql(myquery)

P.S。习惯对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语法。

答案 2 :(得分:-1)

    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 Above Query为我工作。