when语句触发sql

hpcdzsge  于 2021-06-25  发布在  Hive
关注(0)|答案(3)|浏览(149)

我使用mydf.createorreplacetempview(“combine\u table”)在sparksql中使用Dataframe创建了一个临时表。所有字段数据类型都显示为字符串。在这个temp表中,我有4列procuredvalue、minmargin、maxmargin、price和其他一些列。现在我需要根据某些条件选择数据,并且必须将数据显示为新列“最终价格”。我试图用case语句来做这件事,但得到下面的错误。输入不匹配的'1st\u 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""")
46qrfjad

46qrfjad1#

这么多问题。。。
不能用双引号括住查询,也不能用双引号限定其中的字符串(没有正确的转义)。
更简单更干净的解决方案是这样做:

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

val 1st_case=spark.sql(myquery)

p、 习惯于对sql字符串使用单引号。与双引号不同,它适用于所有sql方言。 'min_val_seller.Q' 是字符串文本
Spark中的逻辑与 and ,不是 && case语句以两个相同的条件开始( Sum(i.procuredvalue + i.maxmargin) < min_val_seller.q ). 第二个条件永远不会被选择。
(请确保您了解案例的工作原理)
iso连接是在90年代引入的。没有理由使用where条件而不是正确的连接语法。

mwkjh3gx

mwkjh3gx2#

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上面的查询为我工作。

4xy9mtcn

4xy9mtcn3#

你的问题怎么了?

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

sql格式化程序
sql验证程序

相关问题