为啥在 BigQuery 中取消嵌套两个或多个变量时没有得到任何结果?

Posted

技术标签:

【中文标题】为啥在 BigQuery 中取消嵌套两个或多个变量时没有得到任何结果?【英文标题】:Why when unnesting two or more variables in BigQuery do I get no results?为什么在 BigQuery 中取消嵌套两个或多个变量时没有得到任何结果? 【发布时间】:2017-05-18 11:00:43 【问题描述】:

我正在查看我们网站上的一位访问者的特定操作,只是为了了解如何收集一些数据以及如何提取我需要的数据。基本上,当访问者看到我们网站的某些部分并且我想看看是否正在收集这些数据时,就会触发特定的促销活动。

我运行了以下代码来识别访问者看到的页面以及他们的会话触发的事件:

select fullvisitorid, visitid, date, hitnumber, type, page.pagepath, 
eventinfo.eventcategory, eventinfo.eventlabel, eventinfo.eventaction
from `big-query-156009.xxxxxx.ga_sessions_*` t, t.hits as hits
where _table_suffix between "20170511" and "20170511"
and fullvisitorid = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
and visitid = xxxxxxxxx
order by hitnumber

这工作得很好,我可以看到访客的旅程。我也想拉进来

hits.promotion.promoid, 
hits.promotion.promoname, 
hits.promotion.promocreative, 
hits.promotion.promoposition, 
hits.promotionactioninfo.promoisview,
hits.promotionactioninfo.promoisclick

我已经使用以下代码进行了尝试:

select fullvisitorid, 
visitid, 
date, 
hitnumber, 
type, 
page.pagepath, 
eventinfo.eventcategory, 
eventinfo.eventlabel, 
eventinfo.eventaction, 
promotion.promoId, 
promotion.promoname, 
promotion.promocreative, 
promotion.promoposition,
promotionactioninfo.promoIsView,
promotionactioninfo.promoIsclick
from `big-query-156009.xxxxxx.ga_sessions_*` t, t.hits as hits,
hits.promotion as promotion
where _table_suffix between "20170511" and "20170511"
and fullvisitorid = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
and visitid = xxxxxxxxx
order by hitnumber

但是,当我这样做时,我会得到完全相同的 fullvisitorid、visitid、日期和数据集等,但我没有得到任何结果。没有错误或任何东西都没有结果。

我不完全理解嵌套,所以我假设我只是缺少一些简单的东西。

有什么办法可以在一个查询中提取所有这些数据,还是我需要进行子查询?

谢谢

【问题讨论】:

【参考方案1】:

通过在表t.hitshits.promotion 之间使用逗号(连接)运算符,您可以计算数组元素的叉积。在这种情况下发生的情况是,因为其中一个数组是空的(可能是hits.promotion),所以自1 * <number of hits> * 0 = 0 以来您会得到一个空结果。即使其中一个数组为空,也要获得一行,请改用左连接,例如:

from `big-query-156009.xxxxxx.ga_sessions_*` t
LEFT JOIN UNNEST(t.hits) as hits
LEFT JOIN UNNEST(hits.promotion) as promotion
where ...

【讨论】:

【参考方案2】:

另一种可以帮助您进行此类分析的技术如下:

SELECT
    fullvisitorid fv,
    visitid v,
    ARRAY(SELECT AS STRUCT hits.hitnumber, hits.type, page.pagepath, eventinfo.eventcategory, promotion FROM UNNEST(hits) hits ORDER BY hitnumber) hits
FROM `big-query-156009.xxxxxx.ga_sessions_*`
WHERE
1 = 1
AND EXISTS(SELECT 1 FROM UNNEST(hits) hits WHERE ARRAY_LENGTH(hits.promotion) > 0)

请注意,UNNESTING 进程现在只发生在行级别,而不是作为 CROSS-JOIN。

您还可以使用 WHERE 子句过滤掉您想要的内容(在这种情况下,我删除了所有没有关联任何促销 ID 的行。例如,您也可以仅过滤掉某些 事件类别标签 如果你愿意)。

【讨论】:

以上是关于为啥在 BigQuery 中取消嵌套两个或多个变量时没有得到任何结果?的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中取消嵌套多个嵌套字段

如何在 BigQuery 中取消嵌套多个数组?

如何在存储为字符串的 bigquery 字段中取消嵌套多个数组?

BigQuery - 如何取消嵌套多个数组,并从一列分配值?

BigQuery - 选择多个列并希望排除两个双嵌套列

如何在没有交叉产品的情况下从 BigQuery 中的两列中取消嵌套两个列表,作为单独的行