Сравните одну строку таблицы с каждой строкой второй таблицы - PullRequest
0 голосов
/ 08 апреля 2019

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

date | is_holiday | zone   
9/11/18 | 0 | A    
22/12/18 | 1 | A

и мой праздничный стол выглядит так

start_date | end_date | zone    
20/12/18 | 04/01/18 | A    
21/12/18 | 04/01/18 | B
...

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

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

Это предложение соединения, которое я пробовал:

SELECT mai.*, vac.start_date, datediff(vac.start_date, mai.date)
FROM (SELECT *
      FROM MAIN
      WHERE is_holiday = 0
     ) mai LEFT JOIN
     (SELECT start_date, zone
      FROM VACATIONS_UPDATED
      ORDER BY start_date
     ) vac 
     ON mai.date < vac.start_date AND mai.zone = vac.zone

Я ожидаю, что таблица будет выглядеть так:

date | is_holiday | zone | next_holiday    
9/11/18 | 0 | A | 11    
22/12/18 | 1 | A | 0

Есть ли какие-либо подсказки о том, как этого добиться?

1 Ответ

0 голосов
/ 09 апреля 2019

В SQL это может быть затруднительно, но в случае, если вы открыты для этого из кода, вот как это должно выглядеть. Вам в основном нужен crossJoin

Dataset<Row> table1 = <readData>
Dataset<Row> holidays = <readData>

//then cache the small table to get the best performance

table1.crossJoin( holidays ).filter("table1.zone == holidays.zone AND table1.date < holidays.start_date").select( "table1.*", "holidays.start_date").withColumn("nextHoliday", *calc diff*)

В тех случаях, когда одна строка из table1 соответствует нескольким holiday , вы можете добавить столбец id в table1 и затем сгруппировать crossJoin .

// add unique id to the rows
table1 = table1.withColumn("id", functions.monotonically_increasing_id() )

Некоторые подробности о кросс-джойнах: http://kirillpavlov.com/blog/2016/04/23/beyond-traditional-join-with-apache-spark/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...