Pyspark SQL: случай использования операторов - PullRequest
0 голосов
/ 14 мая 2018

У меня есть фрейм данных, который выглядит следующим образом

>>> df_w_cluster.select('high_income', 'aml_cluster_id').show(10)
+-----------+--------------+
|high_income|aml_cluster_id|
+-----------+--------------+
|          0|             0|
|          0|             0|
|          0|             1|
|          0|             1|
|          0|             0|
|          0|             0|
|          0|             1|
|          1|             1|
|          1|             0|
|          1|             0|
+-----------+--------------+
only showing top 10 rows

Столбец high_income является двоичным и содержит 0 или 1.aml_cluster_id содержит значения, начиная с 0 до 3.Я хочу создать новый столбец, значения которого зависят от значений high_income и aml_cluster_id в этой конкретной строке.Я пытаюсь добиться этого с помощью SQL.

df_w_cluster.createTempView('event_rate_holder')

Чтобы выполнить это, я написал такой запрос -

q = """select * , case 
 when "aml_cluster_id" = 0 and  "high_income" = 1 then "high_income_encoded" = 0.162 else 
 when "aml_cluster_id" = 0 and  "high_income" = 0 then "high_income_encoded" = 0.337 else 
 when "aml_cluster_id" = 1 and  "high_income" = 1 then "high_income_encoded" = 0.049 else 
 when "aml_cluster_id" = 1 and  "high_income" = 0 then "high_income_encoded" = 0.402 else 
 when "aml_cluster_id" = 2 and  "high_income" = 1 then "high_income_encoded" = 0.005 else 
 when "aml_cluster_id" = 2 and  "high_income" = 0 then "high_income_encoded" = 0.0 else 
 when "aml_cluster_id" = 3 and  "high_income" = 1 then "high_income_encoded" = 0.023 else 
 when "aml_cluster_id" = 3 and  "high_income" = 0 then "high_income_encoded" = 0.022 else 
 from event_rate_holder"""

, когда я запускаю его в искре, используя

spark.sql(q)

Я получаю следующую ошибку

mismatched input 'aml_cluster_id' expecting <EOF>(line 1, pos 22)

Есть идеи, как это преодолеть?

РЕДАКТИРОВАТЬ :

Я отредактировал запроссогласно предложению в комментариях к следующему

q = """select * , case 
when aml_cluster_id = 0 and  high_income = 1 then high_income_encoded = 0.162 else 
when aml_cluster_id = 0 and  high_income = 0 then high_income_encoded = 0.337 else 
when aml_cluster_id = 1 and  high_income = 1 then high_income_encoded = 0.049 else 
when aml_cluster_id = 1 and  high_income = 0 then high_income_encoded = 0.402 else 
when aml_cluster_id = 2 and  high_income = 1 then high_income_encoded = 0.005 else 
when aml_cluster_id = 2 and  high_income = 0 then high_income_encoded = 0.0 else 
when aml_cluster_id = 3 and  high_income = 1 then high_income_encoded = 0.023 else 
when aml_cluster_id = 3 and  high_income = 0 then high_income_encoded = 0.022 end
from event_rate_holder"""

, но я все еще получаю ошибки

== SQL ==
select * , case 
when aml_cluster_id = 0 and  high_income = 1 then high_income_encoded = 0.162 else 
-----^^^

, за которыми следует

pyspark.sql.utils.ParseException: "\nmismatched input 'aml_cluster_id' expecting <EOF>(line 2, pos 5)\n\n== SQL ==\nselect * ,

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Для каждого * нужен конец регистра для каждого условия в запросе.и вам понадобится обратная галочка для имен столбцов () and high_income_encoded` имена столбцов должны иметь псевдоним в конце . Поэтому правильный запрос выглядит следующим образом

q = """select * ,
case when `aml_cluster_id` = 0 and  `high_income` = 1 then 0.162 else
  case when `aml_cluster_id` = 0 and  `high_income` = 0 then 0.337 else
    case when `aml_cluster_id` = 1 and  `high_income` = 1 then 0.049 else
      case when `aml_cluster_id` = 1 and  `high_income` = 0 then 0.402 else
        case when `aml_cluster_id` = 2 and  `high_income` = 1 then 0.005 else
          case when `aml_cluster_id` = 2 and  `high_income` = 0 then 0.0 else
            case when `aml_cluster_id` = 3 and  `high_income` = 1 then 0.023 else
              case when `aml_cluster_id` = 3 and  `high_income` = 0 then 0.022
              end
            end
          end
        end
      end
    end
  end
end as `high_income_encoded`
from event_rate_holder"""
0 голосов
/ 14 мая 2018

Правильный синтаксис для используемого вами варианта CASE:

CASE  
   WHEN e1 THEN e2 [ ...n ]   
   [ ELSE else_result_expression ]   
END  

So

  • Затем должно следовать выражение. Там нет места для name = something.
  • ELSE допускается один раз за CASE, а не после каждого WHEN.
  • Ваш оригинальный код отсутствует закрытие END
  • Наконец, столбцы не должны быть заключены в кавычки

Вы, вероятно, имели в виду

CASE 
  WHEN aml_cluster_id = 0 AND high_income = 1 THEN 0.162
  WHEN aml_cluster_id = 0 and  high_income = 0 THEN  0.337
  ...
END AS high_income_encoded 
...