Bigquery运行很长时间 - 获得所需输出的替代方法

时间:2016-07-29 14:20:00

标签: google-bigquery

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

(选择
t1.network AS Network,
 (((SUM(t2.datausage1)+ SUM
(t2.datausage2))/ 1073741824)/ EXACT_COUNT_DISTINCT(t1.user))/ 33 AS Avg_data_GigaBytes_Per_day_Per_User,
来自 (SELECT用户,StartTime,
网络
来自[mytable]
姓名不在的地方('gmail')
 )t1
加入
(SELECT user,datausage1,datausage2
来自[mytable]
WHERE label ='T'
)t2
ON t1.user = t2.user
GROUP BY 1

2 个答案:

答案 0 :(得分: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行,然后就会看起来很慢

答案 1 :(得分:0)

您的查询缺少一些细节,但听起来您需要条件求和而不是连接。有点像:

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