我对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行,因此此查询不会花费很长时间或需要大量数据。不知道为什么,但这里似乎没有使用分区。
谢谢你们的帮助!
暂无答案!
目前还没有任何答案,快来回答吧!