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_dim
和params
转为行,逗号运算符取它们之间的叉积:
SELECT SUM(value.int_value)
FROM UNNEST(event_dim),
UNNEST(params)
WHERE key = "coins_awarded"
有关遗留 SQL 中的 FLATTEN
和标准 SQL 中的等效内容的更多信息,请参阅迁移指南中的 Removing repetition with FLATTEN
。
我将我的 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_dim
和params
转为行,逗号运算符取它们之间的叉积:
SELECT SUM(value.int_value)
FROM UNNEST(event_dim),
UNNEST(params)
WHERE key = "coins_awarded"
有关遗留 SQL 中的 FLATTEN
和标准 SQL 中的等效内容的更多信息,请参阅迁移指南中的 Removing repetition with FLATTEN
。