2017-05-09 33 views
0

获得与任何一个〜100k值相匹配的数据的最佳方式是什么?成千上万个值的红移IN条件

对于这个问题,我使用的是亚马逊的红移数据库,并有一个表像这样用的数百万行百位:

-------------------- 
| userID | c1 | c2 | 
| 101000 | 12 | 'a'| 
| 101002 | 25 | 'b'| 
____________________ 

也有数百万种独特的用户id。我有一个我关心的98,000个用户ID的CSV列表,我想对这些特定用户的列进行数学计算。

select c1, c2 from table where userID in (10101, 10102, ...) 

什么是最好的解决方案来匹配这样的巨型列表?

我的方法是制作一个python脚本,它读入我们条件集中所有用户的结果,然后在python中使用CSV进行过滤。它已经很慢,并且不会在所有情况下都能正常工作。

一位同事建议将98k用户上传到临时表中,然后在查询中加入。这似乎是最聪明的方式,但我想问问你们是否都有想法。

我还想知道是否打印一个疯狂的长SQL查询包含所有98k用户匹配和运行它将工作。出于好奇,甚至会跑?

+3

尝试上载您的同事所建议的数据。 –

+0

我建议不要将它称为临时表。这是一张桌子 - 我希望你会在某个时候再次这样做,所以离开桌子并考虑下一次可重复的过程。对于长SQL查询方法,您通常会发现链中的某个进程无法处理大的字符串。客户端工具,复制粘贴缓冲区或者红移本身。无论如何,你可能会发现你想对同一个数据集进行一些不同的分析,并让它坐在一张桌子上,这样做可以实现这一点。最后,根据查询规划器的不同,'EXISTS'_might_可以比'IN'或'JOIN'执行更好。 –

+0

当然,将用户列表上传到表格中是正确的,但如果你们中的任何一个人都很好奇,我会尝试并运行一个巨人具有98k匹配条件的巨大in()语句的SQL查询实际上将运行并且在适当的时间。 :) – clb

回答

4

正如你的同事所建议的,把你的ID上传到S3临时表中,然后使用COPY将该文件导入到表中。然后,您可以使用INNER JOIN条件在您感兴趣的ID列表上过滤主数据表。

如果将文件上传到S3对您来说不是可行的,可以使用CREATE TEMP TABLE为您的ID列表设置一个表格,然后使用电子表格生成整个INSERT语句来填充临时表格。插入100K可能会很慢,但。

相关问题