【发布时间】:2021-08-28 14:34:54
【问题描述】:
我遵循了这个问题的答案:BigQuery: flatten two repeated columns,但它并不完全有效,尽管它最接近我正在寻找的东西。
我有数据从应用程序从 Google Analytics 发送到 Google BigQuery。我有 10 个重复的列:
event_params [RECORD REPEATED]user_properties [RECORD REPEATED]user_ltv [RECORD NULLABLE]device [RECORD NULLABLE]geo [RECORD NULLABLE]app_info [RECORD NULLABLE]traffic_source [RECORD NULLABLE]event_dimensions [RECORD NULLABLE]ecommerce [RECORD NULLABLE]items [RECORD REPEATED]
只要有新的活动,就会有:
event_dateevent_timestampevent_name
对于每一行。这些重复的属性对于每个事件可以有不同的长度,并且在事件的索引上有对应关系。
下面是前两个重复列 event_params 和 user_properties 的快照,以及我想用这两列和其他列(如果需要)生成的内容:
在这里,我们看到event_params 的长度为 7,user_properties 的长度为 4。当我运行以下代码时:
-- standardSQL
SELECT
event_name, event_params,
user_properties[OFFSET(off)] AS user_properties
FROM
`yepic-2021.analytics_264796885.events_intraday_*`,
UNNEST(event_params) AS event_params WITH OFFSET off
ORDER BY
event_timestamp DESC
LIMIT 50
但这会导致错误:
Array index 4 is out of bounds (overflow)
这是有道理的,因为它们的长度不同。所以我的想法是,如果有人知道如何将null 添加到所有其他列,直到它们的长度等于具有最长长度的列,那么这将产生我想要的完全展平的输出。
这是一个不是我想要的示例,通过在已经展平的桌子上展平,重复出现爆炸式增长:
-- standardSQL
SELECT
event_name, event_params, user_properties
FROM
`yepic-2021.analytics_264796885.events_intraday_*`,
UNNEST(event_params) AS event_params,
UNNEST(user_properties) AS user_properties
ORDER BY
event_timestamp DESC
LIMIT 50
结果:
如果有人可以提供这种方法的帮助,或者比我更了解 BigQuery 以及一种扁平化来自 GA 的数据的简单方法,那么我将非常感谢您的帮助。
临时编辑:
这是我在 BigQuery 中尝试过的代码:
-- standardSQL
WITH data1 AS (
SELECT GENERATE_UUID() AS row_id, event_params, user_properties
FROM `yepic-2021.analytics_264796885.events_intraday_*`
),
data2 AS (
SELECT *, GENERATE_ARRAY(1, GREATEST(ARRAY_LENGTH(event_params), ARRAY_LENGTH(user_properties))) ordinals
FROM data1
)
SELECT row_id, event_params[SAFE_ORDINAL(o)] event_params, user_properties[SAFE_ORDINAL(o)] user_properties
FROM data2, UNNEST(ordinals) o
结果:
【问题讨论】:
标签: google-bigquery google-analytics-firebase