【问题标题】:Bigquery running long - alternate way to get the desired outputBigquery 长时间运行 - 获得所需输出的替代方法
【发布时间】:2016-07-29 14:19:59
【问题描述】:

我有一张带有 appox 的桌子。 450,000 条记录。对于非 gmail 用户,我必须找到每个用户每天的平均数据使用量。 gmail、facebook、yahoo.etc 等应用程序名称被捕获在“名称”字段中。如果“name”的值为“gmail”,另一个名为“label”的字段将捕获一个值为“D”的值,表示它正在捕获数据使用情况并在其他两个字段(Datausage1、datausage2)中更新它。我不能在同一个 where 子句中包含“名称”和“标签”,因为“标签”中捕获了其他值。因此,我加入了如下表,但查询效率不高,并且运行了很长时间。有没有其他方法可以获得所需的结果?

(选择
t1.network AS 网络,
(((SUM (t2.datausage1) + SUM
(t2.datausage2))/1073741824)/EXACT_COUNT_DISTINCT(t1.user))/33 AS Avg_data_GigaBytes_Per_day_Per_User,
来自
(选择用户,开始时间,
网络
FROM [mytable]
姓名不在('gmail')
)t1
加入
(选择用户,datausage1,datausage2
FROM [mytable]
哪里标签='T'
)t2
开启 t1.user=t2.user
按 1 分组
)

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    下面试试

    SELECT
      network,
      AVG(usage_per_day_by_user) AS usage_per_day_per_user_average
    FROM (
      SELECT
        network,
        user,
        DATE(StartTime) AS usage_day,
        SUM(t2.datausage1 + t2.datausage2)/1073741824 AS usage_per_day_by_user
      FROM [mytable]
      WHERE NOT name IN ('gmail') 
      AND label = 'D' 
      GROUP BY 1, 2, 3
    )  
    GROUP BY network  
    

    下面的说法不清楚所以我暂时忽略了它

    I cannot have 'name' and 'label' in the same where clause as there are other values that are captured in 'label'

    顺便说一句,我在您的查询中看到的主要问题是它会为同一用户生成条目的交叉连接。所以基本上你的 0.5M 行变成了 MM 行,这就是你看起来很慢的原因

    【讨论】:

      【解决方案2】:

      您的查询缺少一些细节,但听起来您想要一个条件总和而不是一个连接。大致如下:

      SUM(IF(name='gmail' AND label='D',datausage1+datausage2,<however you calculate the non-gmail case>))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 2022-01-22
        相关资源
        最近更新 更多