2016-11-09 41 views
0

我有一个大的事实表,每天大约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万行。我应该首先汇总数据,然后进行连接吗?

感谢,

拉姆。

+0

您可以包括执行计划? – 2016-11-10 06:07:14

回答

0

因为有您的查询的一些过滤条件,我还以为你可以在你的查询拆分为两个查询首先减少数据量。

 table1 = select * from fact_table 
     WHERE a.region_date >= CAST(date_format(DATE_ADD(CURRENT_DATE,-180), 'yyyyMMdd') AS BIGINT) 
     AND a.is_test = 0 
     AND a.desc = 'VIDEO' 

然后你就可以使用新表比原始表要小得多加入id_lookup

+0

谢谢。我的主要问题是,是否有一种方法可以通过在Spark中使用partition_date分区来优化性能,或者Spark会自动执行此操作? – Ram

+0

我不认为spark.sql.shuffle.partitions会提高性能。但是因为您按region_date选择了数据,所以如果按region_date分区数据,它将提高性能。 –