关于athenapresto中分区的sql右连接

nhaq1z21  于 2021-07-26  发布在  Java
关注(0)|答案(0)|浏览(171)

我对sql和athena aws(presto)是相当陌生的。我尝试获取一个非常小的数据集(几个gb),并将它的每一行与一个非常大的数据集(多tb)中的信息连接起来。
我有一个名为student\ table的表,从中我获取一个特定学生的活动(由几十行组成)。我想给每个学生一个事件id,它存储在一个非常大的表中。在这两个表中,分区都是年、月、日。
到目前为止,我的问题是:

WITH student_hist AS (
SELECT 
    year,month,day,event_time,course,student_id,action
FROM students_table
WHERE 
    AND date_parse(concat(year, '-', month, '-', day),'%Y-%m-%d')
        BETWEEN DATE('2020-01-01') AND DATE('2020-06-01')
    AND student_id = '2594395350'
)

SELECT 
    student_hist.*
    ,events.id
FROM big_table events
RIGHT JOIN student_hist
    ON  CAST(student_hist.year AS INTEGER)  = big_table.year 
    AND CAST(student_hist.month AS INTEGER) = big_table.month
    AND CAST(student_hist.day AS INTEGER)   = big_table.day
    AND student_hist.event_time = big_table.event_time

当我查询仅获取student hist时,我的查询使用大约20gb,但当我运行上面的完整查询以获取事件id时,查询需要大量资源(许多tb),我必须取消它(在破产之前)。我认为问题是分区没有在正确的连接中使用。
你知道如何让分区在正确的连接中工作吗?我还尝试从学生历史中获得不同的日期,将上面的“来自大表事件”替换为:

FROM (SELECT * FROM big_table WHERE date_parse(...date partitions) IN (SELECT dates FROM distinct_dates)) events

但是查询同样使用了太多的资源。我认为这是因为它一遍又一遍地运行子查询。
我希望查询的第二部分只是根据student\u hist中的每一行进行分区。student\u hist总共只有不到100行,因此此查询不会花费很长时间或需要大量数据。不知道为什么,但这里似乎没有使用分区。
谢谢你们的帮助!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题