Как объединить наборы данных со значениями между другими значениями? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть сценарий использования, где мне нужно объединить 2 фрейма данных.

Представление идентификатора

ID  BookTime
1   2
1   5
2   8
2   3
3   4

Представление FareRule

Start End Fare
1   3   10
3   6   20
6   10  25

Вывод является результатомобъединения, проверяя BookTime из таблицы ID.Fare вычисляется на основе окна, которое находится между Start и End из FareRule.

ID  FareDue
1   10
1   20
2   25
2   20
3   20

Я создаю представление из этих фреймов данных и использую CROSS JOIN дляПрисоединяйся к ним.Но, как мы знаем, соединение CROSS стоит дорого, поэтому есть ли лучший способ присоединиться к ним?

SELECT 
    ID, 
    Fare AS FareDue 
FROM 
    ID 
CROSS JOIN 
    FareRule 
WHERE 
   BookTime >=Start 
   AND 
   BookTime< End

1 Ответ

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

Учитывая следующие наборы данных:

val id = Seq((1, 2), (1, 5), (2, 8), (2, 3), (3, 4)).toDF("ID", "BookTime")
scala> id.show
+---+--------+
| ID|BookTime|
+---+--------+
|  1|       2|
|  1|       5|
|  2|       8|
|  2|       3|
|  3|       4|
+---+--------+

val fareRule = Seq((1,3,10), (3,6,20), (6,10,25)).toDF("start", "end", "fare")
scala> fareRule.show
+-----+---+----+
|start|end|fare|
+-----+---+----+
|    1|  3|  10|
|    3|  6|  20|
|    6| 10|  25|
+-----+---+----+

Вы просто join их вместе, используя between выражение.

val q = id.join(fareRule).where('BookTime between('start, 'end)).select('id, 'fare)
scala> q.show
+---+----+
| id|fare|
+---+----+
|  1|  10|
|  1|  20|
|  2|  25|
|  2|  10|
|  2|  20|
|  3|  20|
+---+----+

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

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