BigQuery/Firebase 查询事件,按用户排序 属性

BigQuery/Firebase querying events, order by User Property

我将我的 Firebase 项目连接到 BigQuery,今天收到了昨天的所有事件。

我有一个具有整数参数的用户定义事件。 以及字符串类型的用户 属性 "user_job"(例如 "Pilot"、"Mechanic"、"Programmer"、...) 我想知道按用户作业分组的整数参数的平均值。

是否有提取该信息的SQL查询?

我知道 SQL 但我的问题是数据以某种方式嵌套在 RECORD 中,我不确定如何处理它。 如果每个事件一行,每个用户一列 属性,我就不会有这个问题。如果是这样的话,我可以这样写:

SELECT AVG( param ), user_job FROM table WHERE event_type = "my_event" GROUP BY user_job

但是用户属性在 RECORD(数组?)中,并且 RECORD 中也有多个事件。

或者使用 SQL 查询可能是处理此类请求的错误方法。如果是这样,有人可以指出我的方向。 我看到 BigQuery 中有 user defined functions。那么我应该创建一个用户定义的函数,t运行s 将 Firebase BigQuery 行转换为如上所述的平面结构,这是正确的方法吗?

更新: 我 运行 来自 Sara 和 Elliot 的查询以及在两种情况下处理的字节数相同(这是成本)。 Saras 查询 运行 比 Elliots 快,但这可能是 运行dom 机会(并且 google 数据收费,而不是时间)。 尽管如此,我还是将 Elliots 的答案标记为最终答案,因为根据文档,Standart SQL 是推荐的答案。 我仍然不知道这一切与 UDF 相比如何,可能会对其进行测试。

更新2: 我使用 UDF 实现对其进行了测试,该实现为每个 round_completed 事件发出一个新行(语言、硬币)。它 运行 比 Sara 和 Elliot 发布的 SQL 解决方案更长,处理的数据也更多。

|_Solution___|_Time___|_Data Processed___|
|Sara        |2.1s    |399 KB            |
|Elliot      |2.4s    |399 KB            |
|UDF         |3.4s    |437 KB            |

*请注意,时间可能是一个不好的指标,因为它不知道 googles 数据中心在给定时间的繁忙程度。最后,处理的数据越少,成本越低。我还是把时间算进去了,说不定有用。

要完成此操作,您需要 FLATTEN one of the repeated fields. Using the sample Firebase Analytics datasets,这是一个查询,它执行的操作与您要实现的类似:

SELECT
  user_dim.user_properties.value.value.string_value as lang,
  AVG(event_dim.params.value.int_value) as avg_coins 
FROM 
  FLATTEN([firebase-analytics-sample-data:ios_dataset.app_events_20160607], user_dim.user_properties)
WHERE 
  user_dim.user_properties.key = "language"
  AND event_dim.params.key = "coins_awarded"
GROUP BY 1

这会获取用户奖励的平均硬币数量,按他们的语言偏好分组。

我建议使用 standard SQL 而不是传统的 SQL 进行此类分析,因为它使语义更清晰。用户定义的函数,尤其是遗留 SQL 中的函数,将比仅使用 SQL.

更难维护且成本更高

这是一个可能有帮助的示例查询。要运行它,取消勾选"Show Options"下的"Use Legacy SQL"在UI:

SELECT
  user_properties.value.value.string_value as lang,
  AVG((SELECT SUM(value.int_value)
       FROM UNNEST(event_dim),
         UNNEST(params)
       WHERE key = "coins_awarded")) as avg_coins 
FROM 
  `firebase-analytics-sample-data.ios_dataset.app_events_20160607` t,
    UNNEST(user_dim.user_properties) user_properties
WHERE 
  user_properties.key = "language"
GROUP BY 1;

在这个查询中,逗号运算符用UNNEST(user_dim.user_properties) returns一行中的每个元素重复user_properties:

`firebase-analytics-sample-data.ios_dataset.app_events_20160607`,
  UNNEST(user_dim.user_properties) user_properties

在计算所有重复的int_value总和的子查询中,UNNEST用于将重复的event_dimparams转为行,逗号运算符取它们之间的叉积:

SELECT SUM(value.int_value)
FROM UNNEST(event_dim),
  UNNEST(params)
WHERE key = "coins_awarded"

有关遗留 SQL 中的 FLATTEN 和标准 SQL 中的等效内容的更多信息,请参阅迁移指南中的 Removing repetition with FLATTEN