处理BigQuery中未嵌套记录引起的重复行的最佳实践?

问题描述

处理来自Facebook的数据通常涉及处理所有“辛辣”数据所在的记录。但是,有一个缺点,即大量重复行,如果处理不当,可能会导致报告过多和/或数据不一致。

下面是一个用例,当与我的主要数据(来自不涉及任何嵌套的表)结合使用时,最终数字会略有差异。

使用的技术-Facebook数据->缝合-> BigQuery-> dbt-> Google Data Studio

我通常会在不需要记录的地方创建单独的模型,转换数据,然后将其加入我的其余模型中。例如,从ads_insights的操作记录中获取所有网站购买转化。区别在于:

查询

SELECT count(*) AS row_count
FROM ads_insights

结果:row_count-316

查询

SELECT count(*) AS row_count
FROM ads_insights,UNnesT(actions) AS actions

结果:row_count-5612

取消嵌套后,我将使用行数据为每次转化创建列,如下所示:

CASE WHEN value.action_type = 'offsite_conversion.fb_pixel_purchase' THEN COALESCE(value._28d_click,0) + COALESCE(value._1d_view,0) ELSE 0 END AS website_purchase

最后,我将这个模型加入到我的其余模型中。唯一的问题是,这些5600行在与其余行连接时会引起细微的差异,并且由于我已经使用行数据创建了列,因此我不再关心未嵌套的记录数据,可以返回到我原来的316行。唯一的问题是如何?有哪些技术可以帮助我清理模型?

解决方案: 即使在某些时候像dylanbaker回答中建议的那样对查询中的所有字段进行了汇总和分组,差异仍然存在,并且对数据进行了深入研究后,我发现未嵌套的查询将返回279行,而嵌套的返回314。这将我的注意力集中在未嵌套的查询上,该查询删除35行,而这35行恰好为空。在进行了一些Google搜索之后,我发现了这个StackOverflow article,它建议使用LEFT JOIN UNnesT保留所有具有空记录值的行,而不是CROSS JOIN UNnesT来删除它们。

解决方法

您通常希望在此处进行“枢轴”操作。到此为止的大部分时间,您只需要对相关的列进行求和和分组,即可将其恢复为最初拥有和想要的谷物。

我相信您会想要这样的东西:

select
    ads_insights.some_column,ads_insights.some_other_column,sum(case 
          when value.action_type = 'offsite_conversion.fb_pixel_purchase' 
          then coalesce(value._28d_click,0) + coalesce(value._1d_view,0) 
          else 0 
        end) AS website_purchase
from ads_insights,unnest(actions) as actions
group by 1,2

初始列将是您要从原始表中获得的任何列。 “总和”是指透视和汇总未嵌套的数据。

,

实际上,您可以在select语句中使用嵌套进行一些魔术操作

这对您有用吗?

SELECT
    some_column,(SELECT coalesce(_28d_click,0) + coalesce(_1d_view,0) from unnest(actions) WHERE action_type = "offsite_conversion.fb_pixel_purchase") AS website_purchase
FROM ads_insights