【问题标题】:bigquery best practice for cross querybigquery 交叉查询的最佳实践
【发布时间】:2014-05-01 09:14:04
【问题描述】:

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

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

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

Articles 是一个通用表格,其中包含数千篇可供阅读的文章。 用户操作只需在用户阅读文章时注册。

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

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

可能的解决方案:

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

  2. 我可以在这里执行任何智能连接,但我不确定这会如何失败?? 将搜索工作留给大查询,并且使用的查询调用少于用户数量。

任何关于 2 的帮助将不胜感激

谢谢。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    我会做这样的事情来在一次调用中为所有读者填充一个表格:

            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" )
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2013-05-10
      • 1970-01-01
      • 2013-10-02
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多