交叉查询的bigquery最佳实践

时间:2014-05-01 09:14:04

标签: sql google-bigquery

我是谷歌大查询的新手,并试图了解这里的最佳做法。

我有一个(.net)组件来实现一些文章阅读器行为。

我有两张桌子。 一个是文章,另一个是用户操作。

文章是一个包含数千种可阅读文章的通用表格。 用户操作只需在用户阅读文章时注册。

我的系统中有大约200,000个用户。 在某个时间,我需要通过从文章表中获取1000篇文章并省略他已阅读的文章,为每个用户准备一桶可能的文章。

由于我有超过100,000名用户来构建一个存储桶,我正在寻找最佳解决方案来执行此操作:

可能的解决方案:

  1. 一个。查询所有文章, 湾查询所有用户操作。 C。在代码冗长的操作中创建用户存储桶以省略他所做的操作。 这意味着我在bigquery中执行大约(用户数)+ 1个查询,但我必须在我的代码中进行大量搜索。

  2. 我可以在这里做任何智能联接,但我不确定这是怎么回事? 将搜索工作留给大查询,并且使用的查询次数少于用户数。

  3. 任何有关2的帮助将不胜感激

    谢谢你。

1 个答案:

答案 0 :(得分:2)

我会做这样的事情,在一次通话中为所有读者填充一张表:

        Select User,Article
    from
        (
        Select User,Article,
    Row_Number() Over (Partition by User) as NBR -- to extract only 1000 per users
    From
    (
    ((Select User From
    UserActions
    Group Each by User) -- Unique Users table
    Cross Join 
    Articles) as A -- A contains a list of users with all available articles
    Left Join Each
    (Select User,Article
    From UserAction
    where activity="read"
    Group Each By User,Article
    ) as B  --Using left join to add all available articles and..
    On A.User=B.User
    and A.Article=B.Article

    where B.User Is Null --..filter out already read
    )
    )
    where NBR<=1000 -- filter top 1000 per user

如果您想为每个用户生成一个查询,并且您可以将用户添加到查询中,我会选择更简单的内容,例如:

Select top 1000 Article 
from Articles
where Article not in 
(Select Article from UserAction where User = "your user here" )

希望这有帮助