Расчет значений пар перекрестных продаж из транзакций (SQL / PySpark) - PullRequest
0 голосов
/ 03 марта 2020

У меня есть следующие 2 таблицы и желаемый результат в следующем виде:

1) Таблица с периодами, где у меня есть пара элементов (все комбинации элементов в течение периода) (таблица_1)

period_id start_date end_date item_1 item_2
   1         01-01     01-07    A      B
   1         01-01     01-07    A      C
   1         01-01     01-07    B      C
   2         02-01     02-07    D      E
   2         02-01     02-07    D      F
   2         02-01     02-07    E      F
   .           .         .      .      .
   .           .         .      .      .
   .           .         .      .      .
   n         mm-dd     mm-dd    X      Y

2) Таблица с датой транзакции, транзакцией товара и идентификатором корзины (table_2)

basket_id date_id item_id
   1       01-03    A
   1       01-03    B
   2       01-04    C
   2       01-04    G
   2       01-04    P
   2       01-04    A
   3       02-02    D
   3       02-02    E
   3       02-02    I
   4       02-05    D
   4       02-05    E
   4       02-05    F
   4       02-05    M
   .         .      .
   .         .      .
   .         .      . 
   n       mm-dd    X

Я бы хотел посчитать за период корзины, когда пара товаров находилась в одной корзине Из вышеперечисленных фиктивных данных, каков должен быть результат:

period_id start_date end_date item_1 item_2 common_baskets
   1         01-01     01-07    A      B          1
   1         01-01     01-07    A      C          2
   1         01-01     01-07    B      C          0
   2         02-01     02-07    D      E          2
   2         02-01     02-07    D      F          1
   2         02-01     02-07    E      F          1
   .           .         .      .      .          .
   .           .         .      .      .          .
   .           .         .      .      .          .
   n         mm-dd     mm-dd    X      Y          N

table_1 содержит ~ 1 миллион строк, table_2 ~ 1 миллиард хранится в Had oop, поэтому невозможно l oop поверх содержимого.

Я могу запрашивать с помощью PySpark, но сначала было бы неплохо найти логи c, которые могут решить эту проблему без циклов, мне не обязательно нужен кусок кода, скорее мыслительный процесс, следовательно Я застрял.

1 Ответ

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

Звучит как join с и group by:

select p.period_id, start_date, end_date, item_1, item_2,
       count(b2.basket_id)
from periods p left join
     basket b
     on p.item_1 = b.item_id and
        b.date_id >= p.start_date and
        b.date_id <= p.end_date left join
     basket b2
     on p.item_1 = b2.item_id and
        b2.basket_id = p.basket_id 
group by p.period_id, start_date, end_date, item_1, item_2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...