2017-01-13 19 views
2

我想與星火SQL 2.0SparkSQL - 的相關標量子查詢只能包含相等謂詞

SELECT 
a.id as id, 
(SELECT SUM(b.points) 
    FROM tableB b 
    WHERE b.id = a.id AND b.date <= a.date) AS points 
FROM tableA a 

執行下面的查詢,但我得到以下錯誤

The correlated scalar subquery can only contain equality predicates

任何想法如何重寫查詢或使用兩個數據幀tableA和tableB之間的操作使其工作?

+1

是那裏b.date如何晚於a.date一種模式?它總是一天,一年還是一年?如果是這樣,我們可能可以將該模式添加到比較中,例如:a.date +1 day = b.date – gregory

+0

好評!但不幸的是,b.date可以是比a.date更早的任何日期/時間。 – nicola

+1

下一個問題:你真的需要b.date <= a.date嗎? a.id = b.id是否足夠?還是真的有不止一對匹配的ID?如果是,那麼a和b之間是否還有另一個可以進行的獨特比較? – gregory

回答

1
select a.id as id, 
sum(b.points) as points 
from a, b 
where a.id = b.id 
and b.date <= a.date 
group by a.id 
; 

跳過子選擇和group by ID,以確保IDS和B分列的總和之間的一對一的關係。

這裏的一個「向下和髒」例子我使用:

select * from a ; 

id|date 
1|2017-01-22 17:59:49 
2|2017-01-22 18:00:00 
3|2017-01-22 18:00:05 
4|2017-01-22 18:00:11 
5|2017-01-22 18:00:15 

select * from b ; 
id|points|date 
1|12|2017-01-21 18:03:20 
3|25|2017-01-21 18:03:37 
5|17|2017-01-21 18:03:55 
2|-1|2017-01-22 18:04:27 
4|-4|2017-01-22 18:04:35 
5|400|2017-01-20 18:17:31 
5|-1000|2017-01-23 18:18:36 

注意,b的= 5中,兩個a.date和一個前後ID的三個條目。

select a.id, sum(b.points) as points from a, b where a.id = b.id and b.date <= a.date group by a.id ; 
1|12 
3|25 
5|417 

我也證實了「分組依據」支持:http://spark.apache.org/docs/latest/sql-programming-guide.html#supported-hive-features