我使用mydf.createOrReplaceTempView(“ combine_table”)在sparksql中使用数据框创建了一个临时表。所有字段数据类型都显示为字符串。 在这个临时表中,我有4列procuredValue,minMargin,maxMargin,Price和其他一些列。在所有这4列中,我都具有373.58等值。 现在,我需要根据某些条件选择数据,并且必须将数据显示为新列“最终价格”。我正在尝试使用Case语句执行此操作,但出现错误。 输入'1st_case'不匹配,预计会发生EOF(第3行,第5位) 谁能建议我该怎么做。
Hive.initFlutter('chosenPath')
答案 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)
这么多问题...
-
val myquery = """
select ...
from ...
where ...
"""
val 1st_case=spark.sql(myquery)
P.S。习惯对SQL字符串使用单引号。与双引号不同,它将适用于所有SQL方言。
'min_val_seller.Q'
是字符串文字
Spark中的逻辑AND是and
,而不是&&
CASE语句以两个相同的条件(Sum(i.procuredvalue + i.maxmargin) < min_val_seller.q
)开始。永远不会选择第二个条件。
(请确保您了解CASE的工作原理)
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为我工作。