将表格的一行与第二张表格的每一行进行比较

时间:2019-04-08 08:46:22

标签: sql apache-spark

我正在尝试检索随机日期和下一个已知假日之间的天数。假设我的第一个表格如下所示:

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
...

我想知道第一个表中不是假期的条目与下一个假期日期之间有多少天。

我试图在join子句中获取带有较晚日期的下一行,但是join并不是此任务的工具。我还尝试了按日期分组并将日期与下一行进行比较,但在第一张表中可以有多个具有相同日期的条目,因此它不起作用。

这是我尝试过的join子句:

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 :(得分:0)

在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 中的一行与多个假期匹配的情况下,可以将id列添加到 table1 中,然后将分组> crossJoin

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

crossJoins的一些详细信息: http://kirillpavlov.com/blog/2016/04/23/beyond-traditional-join-with-apache-spark/