我在java spark数据集上尝试以下连接查询:
sqlContext.sql("SELECT * from ScheduledTaskTable AS ST1 "
+ "FULL OUTER JOIN (SELECT * from OpenTaskTable WHERE due_date = cast('"+unscheduledDate+"' as timestamp) "
+ "AND csg_order_id NOT IN(SELECT ST2.csg_order_id from ScheduledTaskTable AS ST2)) AS UnscheduledTaskTable "
+ "ON ST1.csg_order_id = UnscheduledTaskTable.csg_order_id");
ScheduledTaskTable派生自OpenTaskTable。我正在尝试ScheduledTaskTable和来自OpenTaskTable的记录之间的外部联接,该记录具有due_date ='某个值'并且不存在于ScheduledTaskTable中。 但是当我尝试运行上述查询时,spark会发出以下错误:
Reference 'ST2.csg_order_id' is ambiguous, could be: csg_order_id#1, csg_order_id#71.; line 1 pos 165
我搜索了这个问题,但找不到任何针对spark sql的强大解决方案。任何帮助表示赞赏。
答案 0 :(得分:0)
如果您有重复的列,则应使用以下方法:
df1.join(df2, Seq("csg_order_id"), "full_outer")
不确定如何仅使用SQL执行此操作。也许添加表别名并在选择列时使用它们。
答案 1 :(得分:0)
知道了。如我所说,ScheduledTaskTable是从OpenTaskTable派生的。所以我在检索ScheduledTaskTable时添加了一个别名,如下所示: 以前,我正在编写查询以派生scheduleTaskTable,如下所示:
Select * from OpenTaskTable WHERE (some condition);
相反添加别名:
Select OT.* from OpenTaskTable AS OT WHERE (Some condition);
通过这种方式,spark可以分别识别两个数据集(OpenTaskTable和ScheduledTaskTable)的属性。 关键是,如果要创建一个火花查询来获取数据,则最好使用别名,以便以后如果要将数据集与其他具有相同列名的数据集结合在一起,火花将能够通过查找其别名来识别列。