Я хочу понять, как лучше всего решать проблемы, связанные с датами, в spark SQL. Я пытаюсь решить простую проблему, где у меня есть файл с диапазонами дат, как показано ниже:
startdate,enddate
01/01/2018,30/01/2018
01/02/2018,28/02/2018
01/03/2018,30/03/2018
и другая таблица с датой и количеством:
date,counts
03/01/2018,10
25/01/2018,15
05/02/2018,23
17/02/2018,43
Теперь все, что я хочу найти, это сумма отсчетов для каждого диапазона дат, поэтому ожидаемый результат:
startdate,enddate,sum(count)
01/01/2018,30/01/2018,25
01/02/2018,28/02/2018,66
01/03/2018,30/03/2018,0
Ниже приведен код, который я написал, но он дает мне декартово множество результатов:
val spark = SparkSession.builder().appName("DateBasedCount").master("local").getOrCreate()
import spark.implicits._
val df1 = spark.read.option("header","true").csv("dateRange.txt").toDF("startdate","enddate")
val df2 = spark.read.option("header","true").csv("dateCount").toDF("date","count")
df1.createOrReplaceTempView("daterange")
df2.createOrReplaceTempView("datecount")
val res = spark.sql("select startdate,enddate,date,visitors from daterange left join datecount on date >= startdate and date <= enddate")
res.rdd.foreach(println)
Вывод:
| startdate| enddate| date|visitors|
|01/01/2018|30/01/2018|03/01/2018| 10|
|01/01/2018|30/01/2018|25/01/2018| 15|
|01/01/2018|30/01/2018|05/02/2018| 23|
|01/01/2018|30/01/2018|17/02/2018| 43|
|01/02/2018|28/02/2018|03/01/2018| 10|
|01/02/2018|28/02/2018|25/01/2018| 15|
|01/02/2018|28/02/2018|05/02/2018| 23|
|01/02/2018|28/02/2018|17/02/2018| 43|
|01/03/2018|30/03/2018|03/01/2018| 10|
|01/03/2018|30/03/2018|25/01/2018| 15|
|01/03/2018|30/03/2018|05/02/2018| 23|
|01/03/2018|30/03/2018|17/02/2018| 43|
Теперь, если у меня groupby
начальная дата и конечная дата с суммой на счету, я вижу следующий неверный результат:
| startdate| enddate| sum(count)|
|01/01/2018|30/01/2018| 91.0|
|01/02/2018|28/02/2018| 91.0|
|01/03/2018|30/03/2018| 91.0|
Итак, как мы справимся с этим и как лучше всего обращаться с датами в Spark SQL? Должны ли мы строить столбцы как dateType на первом месте ИЛИ читать как строки, а затем при необходимости приводить их к дате?