Spark- sql с несколькими случаями, когда заявления - PullRequest
0 голосов
/ 14 марта 2020

Я создал одну временную таблицу, используя мой фрейм данных в spark sql, используя mydf.createOrReplaceTempView ("Объединить_таблицу"). Все типы данных полей отображаются в виде строки. В этой временной таблице у меня есть 4 столбца procuredValue, minMargin, maxMargin, Price и некоторые другие столбцы. Во всех этих 4 столбцах у меня есть значения, такие как 373.58 ... et c. Теперь мне нужно выбрать данные на основе какого-либо условия и отобразить данные в виде нового столбца. «Окончательная цена». Я пытаюсь сделать это с помощью оператора 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""")

Ответы [ 3 ]

0 голосов
/ 14 марта 2020

Так много вопросов ...

  1. Вы не можете окружить свой запрос двойными кавычками, а также использовать двойные кавычки для определения строк внутри него (без надлежащего экранирования).
    Чем проще и чище решение было бы сделать что-то вроде этого:

-

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

val 1st_case=spark.sql(myquery)

PS привыкнуть использовать одинарные кавычки для SQL строк. Это будет работать для всех SQL диалектов, в отличие от двойных кавычек.

'min_val_seller.Q' является строковым литералом

Логическое И в Spark: and, а не &&

Оператор CASE начинается с двух идентичных условий (Sum(i.procuredvalue + i.maxmargin) < min_val_seller.q). Второе условие никогда не будет выбрано.

(пожалуйста, убедитесь, что вы понимаете, как работает CASE)

Соединения ISO были введены в 90-х годах. Нет причин использовать условия WHERE вместо правильного синтаксиса JOIN.

0 голосов
/ 14 марта 2020
    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 работал для меня.

0 голосов
/ 14 марта 2020

Что происходит с вашим запросом?

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
...