Spark Scala-从另一个视图中选择日期和日期+24小时之间的所有记录

Spark Scala-从另一个视图中选择日期和日期+24小时之间的所有记录,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有两个表,一个主表和一个查找表,其中包含一个日期,我希望从主表中选择该查找日期24小时内的所有记录 maxDiff表: +------------+------------------+-------+-------+----------+ |TemperatureF| Date|MinTemp|MaxTemp|Difference| +------------+------------------+-------+-------+----------+ |

我有两个表,一个主表和一个查找表,其中包含一个日期,我希望从主表中选择该查找日期24小时内的所有记录

maxDiff表:

+------------+------------------+-------+-------+----------+
|TemperatureF|              Date|MinTemp|MaxTemp|Difference|
+------------+------------------+-------+-------+----------+
|        37.9|01/29/2008 5:53 AM|  -11.9|   39.2|      51.1|
+------------+------------------+-------+-------+----------+
此表仅包含一行。我想用这个日期,在这个日期的24小时内查找所有记录。日期+24

OSHIVIEW主表示例:

+------------+-------------------+---------+-------+-------+
|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()
有什么想法吗?

主数据帧中的日期和时间戳值似乎不匹配,因此我将在两个数据帧中使用列日期,以减少错误发生率,并应用unix\u时间戳比较它们的时差作为连接条件:

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|
// +------------+------------------+----------+-------+-------+------------+------------------+

当我试图将其合并到我的代码中时,它执行笛卡尔乘积并返回主控中的所有行,而不仅仅是24小时时间范围内的行。@peakstatus,根据连接条件,主控中的所有行只有在24小时时间范围内的查找中都有对应的行时才会被包括在内。为什么不使用演示上述问题的最小数据集编辑示例数据,以便我可以帮助查找可能的原因?我更新了主表的数据。这是我要找的东西的全貌。查看主表中的数据时,您可以看到MinTemp/MaxTemp发生在输入数据的24小时内。2008年1月29日上午5点53分为Max,2008年1月30日上午5点53分为-11.9。我的查找表日期指示此时间段的开始。我只想选择此记录后24小时内的所有记录。所以从我的主表中,我只需要从01/29/2008 5:53 AM到01/30/2008 5:53 AM的记录。这有助于澄清我的问题吗?啊,我当时误解了你的要求。只需删除abs函数并修改连接条件,如我修改后的答案所示,它将返回所需的结果。这非常有效,我感谢您对此的见解。