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

Posted

技术标签:

【中文标题】Bigquery 长时间运行 - 获得所需输出的替代方法【英文标题】:Bigquery running long - alternate way to get the desired output 【发布时间】: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 分组 )

【问题讨论】:

【参考方案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>))

【讨论】:

以上是关于Bigquery 长时间运行 - 获得所需输出的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery Innerjoin 运行了很长时间

BigQuery - 删除重复记录有时需要很长时间

BigQuery 查询需要很长时间

为啥 BigQuery API 调用需要这么长时间?

BigQuery 脚本 - 慢

GCP 云上的长时间运行作业