Spark Scala - Выбрать все записи между датой и датой + 24 часа из другого просмотра - PullRequest
0 голосов
/ 11 апреля 2020

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

таблица maxDiff:

+------------+------------------+-------+-------+----------+
|TemperatureF|              Date|MinTemp|MaxTemp|Difference|
+------------+------------------+-------+-------+----------+
|        37.9|01/29/2008 5:53 AM|  -11.9|   39.2|      51.1|
+------------+------------------+-------+-------+----------+

Эта таблица содержит только одну строку. Я хочу использовать эту дату, чтобы просмотреть все записи в течение 24 часов с этой даты. (Дата + 24).

Образец oshView (основная таблица):

+------------+-------------------+---------+-------+-------+
|TemperatureF|               Date|timestamp|MinTemp|MaxTemp|
+------------+-------------------+---------+-------+-------+
|        39.0| 01/29/2008 4:53 AM|1201582380|  -11.0|   39.2|
|        37.9| 01/29/2008 5:53 AM|1201585980|  -11.9|   39.2|
|        37.9| 01/29/2008 6:53 AM|1201589580|  -11.9|   39.2|
|        37.4| 01/29/2008 7:38 AM|1201592280|  -11.9|   39.2|
|        37.0| 01/29/2008 7:53 AM|1201593180|  -11.9|   39.2|
|        37.4| 01/29/2008 8:11 AM|1201594260|  -11.9|   39.2|
|        -9.4| 01/30/2008 3:30 AM|1201663800|  -11.9|    1.9|
|       -11.0| 01/30/2008 3:53 AM|1201665180|  -11.9|    1.9|
|       -11.0| 01/30/2008 4:53 AM|1201668780|  -11.9|    1.9|
|       -11.9| 01/30/2008 5:53 AM|1201672380|  -11.9|    1.9|
|       -11.9| 01/30/2008 6:53 AM|1201675980|  -11.9|    1.9|
|       -11.9| 01/30/2008 7:53 AM|1201679580|  -11.9|    1.9|
|         1.0| 01/30/2008 4:53 PM|1201711980|   -2.0|   12.0|
|         1.0| 01/30/2008 5:53 PM|1201715580|   -2.0|   12.9|
|         0.0| 01/30/2008 6:53 PM|1201719180|   -2.0|   12.9|
|         0.0| 01/30/2008 7:53 PM|1201722780|   -2.0|   12.9|
|        -0.9| 01/30/2008 8:53 PM|1201726380|   -2.0|   14.0|
|        -0.9| 01/30/2008 9:53 PM|1201729980|   -2.0|   15.8|
|        -0.9|01/30/2008 10:53 PM|1201733580|   -2.0|   16.0|
|        -0.9|01/30/2008 11:53 PM|1201737180|   -2.0|   16.0|
+------------+-------------------+---------+-------+-------+

Ожидаемый результат:

+------------+-------------------+---------+-------+-------+
|TemperatureF|               Date|timestamp|MinTemp|MaxTemp|
+------------+-------------------+---------+-------+-------+
|        35.1|01/30/2008 12:53 AM|946687980|   28.0|   36.0|
|        35.1| 01/30/2008 1:53 AM|946691580|   28.0|   36.0|
+------------+-------------------+---------+-------+-------+

Я пробовал следующее, но получаю пустое результат.

spark.sqlContext.sql("Select * from oshView where Date between (Select Date from maxDiff) AND (Select Date from maxDiff) + INTERVAL 1 DAY").show()

Есть мысли?

1 Ответ

1 голос
/ 11 апреля 2020

Значения Date и Timestamp в вашем основном Dataframe, похоже, не совпадают, поэтому я собираюсь использовать столбец Date в обоих DataFrames (в любом случае менее подверженных ошибкам) ​​и применять unix_timestamp сравнить разницу во времени как условие join:

val lookup = Seq(
  (37.9, "01/29/2008 5:53 AM")
).toDF("TemperatureF", "Date")

val master = Seq(
  (35.1, "01/29/2008 4:53 AM", 1201582380, -11.0, 39.2),
  (37.9, "01/29/2008 5:53 AM", 1201585980, -11.9, 39.2),
  (-11.0, "01/30/2008 4:53 AM", 1201668780, -11.9, 1.9),
  (-11.0, "01/30/2008 5:53 AM", 1201672380, -11.9, 1.9),
  (-11.9, "01/30/2008 6:53 AM", 1201675980, -11.9, 1.9)
).toDF("TemperatureF", "Date", "Timestamp", "MinTemp", "MaxTemp")

val dateFormat = "MM/dd/yyyy HH:mm a"
val deltaTime = 60 * 60 * 24

master.join(
  lookup,
  unix_timestamp(master("Date"), dateFormat) - unix_timestamp(lookup("Date"), dateFormat)
    between (0, deltaTime)
).show
// +------------+------------------+----------+-------+-------+------------+------------------+
// |TemperatureF|              Date| Timestamp|MinTemp|MaxTemp|TemperatureF|              Date|
// +------------+------------------+----------+-------+-------+------------+------------------+
// |        37.9|01/29/2008 5:53 AM|1201585980|  -11.9|   39.2|        37.9|01/29/2008 5:53 AM|
// |       -11.0|01/30/2008 4:53 AM|1201668780|  -11.9|    1.9|        37.9|01/29/2008 5:53 AM|
// |       -11.0|01/30/2008 5:53 AM|1201672380|  -11.9|    1.9|        37.9|01/29/2008 5:53 AM|
// +------------+------------------+----------+-------+-------+------------+------------------+
...