Bigquery - 数组索引 5 超出范围

Posted

技术标签:

【中文标题】Bigquery - 数组索引 5 超出范围【英文标题】:Bigquery - array index 5 is out of bounds 【发布时间】:2019-12-28 23:39:01 【问题描述】:

我的查询有两个问题。查询的想法是将水平 eventInfo 数据列化,然后将其连接到具有特定名称数据的另一个表。

    以下代码仅适用于一个 sessionId。如果没有 where 子句,我会收到以下错误:Error: Array index 5 is out of bounds (overflow). 解决了。我混淆了列名。 序数的 arg 不是我取最大值的那个。

    第二个问题是,虽然我取了几乎所有数组的最后一行,但我想在最终结果之上取消嵌套名称数组。 示例输出为每个 sessionId 返回一行,但如果名称数组有多个值,最终结果应该是每个人的一行,每个 sessionId/date/checkin 组合。我不确定为什么我对名称数组的取消嵌套不起作用... 现在我得到一个 字段名称 val 在 STRUCT 中不存在。这是在 names.val 行。

这是一个基线查询:

with eventData as ( 
 select
 concat(fullVisitorId, ' ', cast(VisitId as string)) sessionId, date as date, 
 hit.hour as checkinHour, hit.minute as checkinMin,
 (select array_agg(hit.eventInfo.eventAction) from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'foo') as foo_value,
 (select array_agg(struct(hit.eventInfo.eventAction)) as val from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'submit_checkin') as names
 FROM  `web-analytics.192016109.ga_sessions_20191223`,
 UNNEST(hits) as hit
 )
 select 
 sessionId, date, 
 max(checkinHour) chkHr, max(checkinMin) as chkMin, # end of transaction
 max(foo_value[ordinal(ARRAY_LENGTH(foo_value))]) as foo_value, 
 names.val
 from eventData,
 unnest (names) as names
 group by sessionId, date

任何帮助将不胜感激,因为我不是这种语法的专家。 节日快乐!

【问题讨论】:

【参考方案1】:

对于第一项,您可能正在处理应该是数组的空值。索引越界错误是由 ordinal function

引起的

对于第二项,你应该尝试使用左连接而不是“,”,例如:

 from eventData left join
 unnest (names) as names
 group by sessionId, date

相对于:

from eventData,
 unnest (names) as names
 group by sessionId, date

当您有null 数组时,您可能会丢失一些执行unnest 的数据,因此您可以使用left join 来避免这种情况。

只有一个问题:names 列有什么用途吗?在您的查询中,此列似乎没有理由出现。

编辑 1:

尝试使用 names.eventAction 而不是 names.val。另外,LEFT JOIN 似乎是最好的选择。

with eventData as (   select  concat(fullVisitorId, ' ', cast(VisitId as string)) sessionId, date as date,   hit.hour as checkinHour, hit.minute as checkinMin,  (select array_agg(hit.eventInfo.eventAction) from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'foo') as foo_value,  (select array_agg(struct(hit.eventInfo.eventAction)) as val from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'submit_checkin') as names  FROM  `data-to-insights.ecommerce.web_analytics`,  UNNEST(hits) as hit )  select 
     sessionId, 
     date, 
     max(checkinHour) chkHr, max(checkinMin) as chkMin, # end of transaction
     max(foo_value[ordinal(ARRAY_LENGTH(foo_value))]) as foo_value, 
     names.eventAction name_val    from eventData left join  unnest (names) as names  group by sessionId, date, name_val

【讨论】:

您好,感谢您的回复!我今天会试试的!我正在使用名称,我只是不想淹没代码。 如果您的问题得到妥善解决,请告诉我 您好@rmesteves,我能够解决第一个问题。对于名称的第二个问题,我将其添加到选择中(正如您提到的,它当前没有被使用),然后得到 SELECT 列表表达式引用表别名的问题,该名称既不分组也不聚合。但我不能按数组“名称”分组。我不确定在这里尝试什么。我也用左连接试过这个,但没有用 能否提供完整的查询? 你好。尝试将 names.val 替换为 names.eventAction,因为它是该结构内字段的名称。此外,当我使用 LEFT JOIN 运行查询时,它会给我带来结果,当我使用逗号运行时,它不会给我带来任何结果。我将在我的答案中更新查询。请让我知道它是否适合您。【参考方案2】:

我找到了答案。我需要使用 names.eventAction 而不是 names.val。这是因为当我取消嵌套名称时 val 结构被展平了。所以技术上不存在了。 我还假设 val 是字段的名称,但 val 是结构的名称。

【讨论】:

以上是关于Bigquery - 数组索引 5 超出范围的主要内容,如果未能解决你的问题,请参考以下文章

索引超出了数组拆分函数的范围[重复]

Swift 致命错误:数组索引超出范围

Swift 5:从 tableView numberOfRowsInSection 返回数组计数时索引超出范围

如何重新创建“索引超出数组范围”将项目添加到字典?

为啥 List<T> 的“索引超出范围”异常,但数组却没有?

数组索引超出范围