Как добавить строки для отсутствующей комбинации данных и приписать соответствующие поля 0 - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть комбинация домена и месяца с общим количеством заказов в соответствующем месяце. Я хотел бы приписать недостающую комбинацию с 0 значениями. Какие наименее дорогие команды агрегирования можно использовать в Pyspark для достижения этой цели?

У меня есть следующая таблица ввода:

domain      month    year   total_orders
google.com  01       2017   20
yahoo.com   02       2017   30
google.com  03       2017   30
yahoo.com   03       2017   40
a.com       04       2017   50
a.com       05       2017   50
a.com       06       2017   50

Ожидаемый результат:

domain      month    year   total_orders
google.com  01       2017   20
yahoo.com   02       2017   30
google.com  03       2017   30
yahoo.com   03       2017   40
a.com       04       2017   50
a.com       05       2017   50
a.com       06       2017   50
google.com  02       2017   0
google.com  04       2017   0
yahoo.com   04       2017   0
google.com  05       2017   0
yahoo.com   05       2017   0
google.com  06       2017   0
yahoo.com   06       2017   0

Здесь ожидаемый порядок вывода не имеет большого значения.

1 Ответ

0 голосов
/ 03 ноября 2018

Самый простой способ - объединить все месяцы и годы для каждого домена:

select my.year, my.month, d.domain, coalesce(t.total_orders, 0) as total_orders
from (select distinct month, year from input) my cross join
     (select distinct domain from input) d left join
     t
     on t.month = my.month and t.year = my.year and t.domain = d.domain;

Примечание. Предполагается, что каждая комбинация года / месяца встречается хотя бы один раз, где-то в данных.

Получение значений в пределах диапазона - это боль, потому что вы разбили дату на несколько столбцов. Позвольте мне предположить, что годы все такие же, как в вашем примере:

select my.year, my.month, d.domain, coalesce(t.total_orders, 0) as total_orders
from (select distinct month, year from input) my join
     (select domain, min(month) as min_month, max(month) as max_month
      from input
     ) d
     on my.month >= d.min_month and my.month <= d.max_month left join
     t
     on t.month = my.month and t.year = my.year and t.domain = d.domain
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...