我有两个表,table_a and 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列)
我想在同一键col_2上加入两个表,但是它已经运行了16个小时,尚未完成...Pyspark代码如下:
combine_table = table_a.join(table_b, table_a.col_2 == table_b.col_2, 'left_outer').collect()
是否有任何有效的方法可以加入这样的两个大桌?
当心爆炸加入。
使用打开数据集,此查询不会在合理的时间内运行:
#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
)