BigQuery:展平多个不同长度的重复列

问题描述

我已经按照对这个问题给出的答案进行操作: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_date
  • event_timestamp
  • event_name

对于每一行。这些重复的属性对于每个事件可以有不同的长度,并且在事件的索引上有对应关系。

下面是前两个重复列 event_paramsuser_properties 的快照,以及我想用这两列和其他列(如果需要)生成的内容:

Image of BigQuery default table

这里我们看到 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,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

结果:

Image of flatten flatten table


如果有人可以帮助使用这种方法或比我更了解 BigQuery 以及一种从 GA 中展平数据的简单方法,那么我将非常感谢您的帮助。


临时编辑:

这是我在 BigQuery 中尝试过的代码:

-- standardSQL
WITH data1 AS (
    SELECT GENERATE_UUID() AS row_id,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

结果:

BigQuery Answer Results

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)