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 5:从 tableView numberOfRowsInSection 返回数组计数时索引超出范围