我有两个表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()
是否有任何有效的方法可以加入这样的两个大表?
答案 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
)