Spark Scala-从另一个视图中选择日期和日期+24小时之间的所有记录
我有两个表,一个主表和一个查找表,其中包含一个日期,我希望从主表中选择该查找日期24小时内的所有记录 maxDiff表:Spark Scala-从另一个视图中选择日期和日期+24小时之间的所有记录,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有两个表,一个主表和一个查找表,其中包含一个日期,我希望从主表中选择该查找日期24小时内的所有记录 maxDiff表: +------------+------------------+-------+-------+----------+ |TemperatureF| Date|MinTemp|MaxTemp|Difference| +------------+------------------+-------+-------+----------+ |
+------------+------------------+-------+-------+----------+
|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函数并修改连接条件,如我修改后的答案所示,它将返回所需的结果。这非常有效,我感谢您对此的见解。