【问题标题】:bigQuery - JoinbigQuery - 加入
【发布时间】:2016-03-05 02:29:02
【问题描述】:

我正在尝试在 ID 上加入两个数据库。第一个报价数据库没有网站上的数据,所以我想从日志数据库中加入它。但是,在日志数据库中,ID 不是唯一的,而是 ID 的第一次按时间顺序出现 - 这是正确的网站。 当我运行下面的查询时,我得到:

查询执行期间资源超出。

因此我不知道问题是代码还是其他问题。

谢谢

SELECT ID, user,busWeek, count(*) as num FROM [datastore.quotes] 

Join (
select objectID, first(website) from (
select objectID, website, date from [datastore.allLogs] 
order by date) group by objectID)
as Logs

on ID = objectID

group by ID,user,busWeek

【问题讨论】:

  • 您能否将您的双选推送到另一个临时表中,然后对其进行连接?虽然这将是两个查询,但第一部分不必与外部选择同时运行这一事实可能会有所帮助。

标签: join google-bigquery


【解决方案1】:

我认为问题在于 ORDER BY。这会将所有计算带到一个节点,从而导致“资源超出”消息。我知道您需要它为每个对象带来第一个(按日期)网站。
尝试重写此选择(内部连接)以进行分区。 例如使用带有 OVER(PARTITION BY ... ORDER BY) 的窗口函数 在这种情况下,我认为,您有机会并行进行此操作

请参阅下文
Window Functions

【讨论】:

    【解决方案2】:

    你可以试试:

    SELECT ID, user,busWeek, count(*) as num FROM [datastore.quotes] 
    
    Join EACH (
    select objectID, first(website) from (
    select objectID, website, date from [datastore.allLogs] 
    order by date) group EACH by objectID)
    as Logs
    
    on ID = objectID
    
    group by ID,user,busWeek
    

    请注意“EACH” - 将来不再需要该关键字,但它今天仍然有用。

    【讨论】:

    • 这很奇怪,因为查询返回相同的“查询执行期间超出资源”。即使我将查询限制为 50,它也会返回它
    • 限制不会改变查询的运行方式。它只是改变了返回的内容。如果没有足够的资源来执行查询,限制将无济于事,因为限制是在查询完全运行后应用的。你能把你的连接表放在一个实际的表中并在那里进行连接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2014-05-23
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多