我有一个大的事实表,每天大约500M行。该表由region_date分区。优化大表加盟PySpark
我必须每天扫描6个月的数据,根据ID号为&的日期列与另一个更小的子集(1M行)左外部连接并计算两个聚合值:sum(fact)if id exists in right table &总和(事实)
我SparkSQL看起来是这样的:
SELECT
a.region_date,
SUM(case
when t4.id is null then 0
else a.duration_secs
end) matching_duration_secs
SUM(a.duration_secs) total_duration_secs
FROM fact_table a LEFT OUTER JOIN id_lookup t4
ON a.id = t4.id
and a.region_date = t4.region_date
WHERE a.region_date >= CAST(date_format(DATE_ADD(CURRENT_DATE,-180), 'yyyyMMdd') AS BIGINT)
AND a.is_test = 0
AND a.desc = 'VIDEO'
GROUP BY a.region_date
什么是优化和分发/分区数据的最佳方式?查询现在运行3个多小时。我试图spark.sql.shuffle.partitions = 700
如果我在“ID”层次卷起每日数据,这是每天约500万行。我应该首先汇总数据,然后进行连接吗?
感谢,
拉姆。
您可以包括执行计划? – 2016-11-10 06:07:14