Я пытаюсь выполнить приведенный ниже синтаксис SQL в PySpark. Предполагается, что запрос возвращает показатель успешности подписки (total subscription / total_entries). table_name = банковское дело имя столбца: «y» (приобретенная подписка) содержит «да» и «нет» в качестве значения данных.
Запрос выполнен:
spark.sql ("выберите (x.total_subscribed / y.total_entries) как success_rate from (выберите count () как total_subscribed из bank_tbl, где y = 'yes') x, (select count () как total_entries from banking_tbl) y ") .show ()
Я использую два внутренних подзапроса:
первый внутренний запрос ниже возвращает общее количество клиентов, которые приобрели подписку:
(выберите count (*) как total_subscribed из banking_tbl, где y = 'yes') x)
Второй запрос возвращает всех клиентов из таблицы:
(выберите count (*) как total_entries из bank_tbl) y ")
и внешний запрос для получения скорости подписки: (общее количество клиентов, которые приобрели подписку / общее количество клиентов)
выберите (x.total_subscribed / y.total_entries) как success_rate
Но я получаю следующее сообщение об ошибке:
"используйте синтаксис CROSS JOIN, чтобы разрешить декартовы произведения между этими \ nотношениями, или: разрешите неявные декартовы произведения установив в конфигурации \ nvariable spark.sql.crossJoin.enabled = true; '"
Пример данных: + --- + ------------ + -------- + --------- + ------- + ----- - + ------- + ---- + ------- + --- + ----- + -------- + ------- - + ----- + -------- + -------- + --- + | возраст | работа | в браке | образование | по умолчанию | баланс | жилье | кредит | контакт | день | месяц | продолжительность | кампания | дней | предыдущий | результат | y | + --- + ------------ + -------- + --------- + ------- + ----- - + ------- + ---- + ------- + --- + ----- + -------- + ------- - + ----- + -------- + -------- + --- + | 58 | менеджмент | женат | высшее образование | нет | 2143 | да | нет | неизвестно | 5 | май | 261 | 1 | -1 | 0 | неизвестно | нет | | 44 | техник | холост | вторичный | нет | 29 | да | нет | неизвестно | 5 | май | 151 | 1 | -1 | 0 | неизвестно | нет | | 33 | предприниматель | женат | вторичный | нет | 2 | да | да | неизвестно | 5 | май | 76 | 1 | -1 | 0 | неизвестно | нет | | 47 | рабочий | женат | неизвестно | нет | 1506 | да | нет | неизвестно | 5 | май | 92 | 1 | -1 | 0 | неизвестно | нет | | 33 | неизвестно | single | unknown | no | 1 | no | no | unknown | 5 | may | 198 | 1 | -1 | 0 | unknown | no | | 35 | менеджмент | женат | высшее образование | нет | 231 | да | нет | неизвестно | 5 | май | 139 | 1 | -1 | 0 | неизвестно | нет | | 28 | менеджмент | холост | высшее образование | нет | 447 | да | да | неизвестно | 5 | май | 217 | 1 | -1 | 0 | неизвестно | нет | | 42 | предприниматель | в разводе | высшее образование | да | 2 | да | нет | неизвестно | 5 | май | 380 | 1 | -1 | 0 | неизвестно | нет | | 58 | пенсионер | замужем | начальное образование | нет | 121 | да | нет | неизвестно | 5 | май | 50 | 1 | -1 | 0 | неизвестно | нет | | 43 | техник | холост | вторичный | нет | 593 | да | нет | неизвестно | 5 | май | 55 | 1 | -1 | 0 | неизвестно | нет | | 41 | админ. | разведены | вторичное | нет | 270 | да | нет | неизвестно | 5 | май | 222 | 1 | -1 | 0 | неизвестно | нет | | 29 | админ. | холостые | вторичные | нет | 390 | да | нет | неизвестно | 5 | май | 137 | 1 | -1 | 0 | неизвестно | нет | | 53 | техник | замужем | вторичка | нет | 6 | да | нет | неизвестно | 5 | май | 517 | 1 | -1 | 0 | неизвестно | нет | | 58 | техник | замужем | неизвестно | нет | 71 | да | нет | неизвестно | 5 | май | 71 | 1 | -1 | 0 | неизвестно | нет | | 57 | услуги | замужем | вторичный | нет | 162 | да | нет | неизвестно | 5 | май | 174 | 1 | -1 | 0 | неизвестно | нет | + --- + ------------ + -------- + --------- + ------- + ----- - + ------- + ---- + ------- + --- + ----- + -------- + ------- - + ----- + -------- + -------- + --- +


Я думаю, что проще использовать условную агрегацию:
select avg(case when y = 'yes' then 1.0 else 0 end)
from banking_tbl;
на самом деле ваш формат запроса неверен spark.sql ('' 'выберите значение subscription_count / total_count как success_rate from (выберите (выберите count () из bank_tbl) как total_count, (выберите count () from banking_tbl, где subscription =' Y ') как subscription_count)' ''). show () как это выполнялось, пожалуйста, проверьте ссылку для вывода https://knowledges.co.in/q-a/
Предоставьте образцы данных, желаемые результаты и объяснение того, что должен делать запрос.