我正在使用Spark SQL,并且尝试使用以下查询来获取记录:
/*Select all open tasks which are not unscheduled*/
Dataset<Row> scheduledOpenTasks = sqlContext.sql(
"SELECT * "
+ "FROM OpenTaskTable "
+ "WHERE due_date < cast('" + unscheduledDate + "' as timestamp)");
scheduledOpenTasks.createOrReplaceTempView("ScheduledOpenTaskTable");
/*Select scheduled tasks with max due_date for each csg_order_id*/
Dataset<Row> scheduledTasks = sqlContext.sql(
"SELECT TS1.* from ScheduledOpenTaskTable AS TS1 "
+ "INNER JOIN "
+ " (SELECT csg_order_id, MAX(due_date) AS MaxDD"
+ " FROM ScheduledOpenTaskTable"
+ " GROUP BY csg_order_id) AS TS2 "
+ "ON TS1.csg_order_id = TS2.csg_order_id AND TS1.due_date = TS2.MaxDD");
计划外的_date的值为4444-12-30
。
在OpenTaskTable
中,每个csg_order_id
可以有多个due_date
,包括unscheduled_date
。除了csg_order_id
之外,我需要due_dates
最高的unscheduled_date
。
现在,通过第一个查询,我将删除所有due_date
为unscheduled_date
的记录。在第二个查询中,我将为每个due_date
检索最大为csg_order_id
的所有记录。
现在出现了问题:有什么方法可以将这些查询组合为一个?
答案 0 :(得分:0)
经过一段时间的努力,终于找到了一种将上述两个查询结合起来的方法:
sqlContext.sql("SELECT OT1.* from OpenTaskTable AS OT1 INNER JOIN "
+ "(SELECT OT2.csg_order_id, MAX(OT2.due_date) AS MaxDD FROM "
+ "(SELECT csg_order_id, due_date from OpenTaskTable WHERE due_date < cast('"+unscheduledDate+"' as timestamp)) AS OT2 "
+ "GROUP BY OT2.csg_order_id) AS OT3 "
+ "ON OT1.csg_order_id = OT3.csg_order_id AND OT1.due_date = OT3.MaxDD");
说明: 以前,在第一个查询中,我是从OpenTaskTable中检索数据,然后将其提供给第二个查询。逻辑上,同样在第二个查询中,我只是对检索到的数据应用更多过滤器。最后,我们试图仅从OpenTaskTable中获取所有属性。
因此,对于此解决方案,我仅使用第一个查询作为最内部的查询,然后在csg_order_id分组的记录中选择MAX。并且,对于最外部的查询,只需执行内部联接即可从OpenTaskTable中获取所有匹配的csg_order_id记录。