参考' column_name'很暧昧

时间:2018-06-18 21:31:30

标签: java apache-spark spring-boot apache-spark-sql

我在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的强大解决方案。任何帮助表示赞赏。

2 个答案:

答案 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)的属性。 关键是,如果要创建一个火花查询来获取数据,则最好使用别名,以便以后如果要将数据集与其他具有相同列名的数据集结合在一起,火花将能够通过查找其别名来识别列。