如何有效地省去加入两个大表

时间:2017-10-01 03:50:14

标签: mapreduce google-bigquery pyspark-sql

我有两个表table_a和table_b, table_a包含216646500行,7155998163字节; table_b包含1462775行,2096277141字节

table_a的架构是:c_1,c_2,c_3,c_4; table_b的架构是:c_2,c_5,c_6,...(约10列)

我想做一个left_outer加入同一个键col_2上的两个表,但是它运行了16个小时还没有完成... pyspark代码如下:

combine_table = table_a.join(table_b, table_a.col_2 == table_b.col_2, 'left_outer').collect()

是否有任何有效的方法可以加入这样的两个大表?

1 个答案:

答案 0 :(得分:0)

小心爆炸连接。

使用开放数据集时,此查询将无法在合理的时间内运行:

#standardSQL
SELECT COUNT(*)
FROM `fh-bigquery.reddit_posts.2017_06` a
JOIN `fh-bigquery.reddit_comments.2017_06` b
ON a.subreddit=b.subreddit

如果我们从每一方摆脱前100名加入密钥怎么办?

#standardSQL
SELECT COUNT(*)
FROM (
  SELECT * FROM `fh-bigquery.reddit_posts.2017_06`
  WHERE subreddit NOT IN (SELECT value FROM UNNEST((
  SELECT APPROX_TOP_COUNT(subreddit, 100) s
  FROM `fh-bigquery.reddit_posts.2017_06`
)))) a
JOIN (
  SELECT * FROM `fh-bigquery.reddit_comments.2017_06` b
  WHERE subreddit NOT IN (SELECT value FROM UNNEST((
  SELECT APPROX_TOP_COUNT(subreddit, 100) s
  FROM `fh-bigquery.reddit_comments.2017_06`
)))) b
ON a.subreddit=b.subreddit

此修改后的查询在70秒内运行,结果为:

90508538331

900亿。这是一个爆炸性的加入。我们在一个表中有900万行,在第二个表中有8000万行,我们的连接产生了900亿行 - 即使从每一行中删除了前100个键。

在您的数据中 - 查找可能产生过多结果的任何键,并在生成连接之前将其删除(有时它是默认值,如null