是否可以在数据洞察计算中使用 BigQuery 重复字段?

Posted

技术标签:

【中文标题】是否可以在数据洞察计算中使用 BigQuery 重复字段?【英文标题】:Is it possible to use BigQuery repeated fields in Data Studio calculations? 【发布时间】:2019-05-13 22:34:50 【问题描述】:

在 BigQuery 表中,我在表的第 1 行有以下数据:

[
  
    "order_key": "4416",
    "order_product": [
      
        "id": "116608",
        "key": "5215",
        "subtotal": "7.99",
        "stock_move": [
          
            "id": "64316",
            "inventory_value": "2.33",
          
        ]
      ,
      
        "id": "116609",
        "key": "5216",
        "subtotal": "39.99",
        "stock_move": [
          
            "id": "64317",
            "inventory_value": "17.23",
          
        ]
      ,
      
        "id": "116611",
        "key": "5218",
        "subtotal": "139.94",
        "stock_move": [
          
            "id": "64319",
            "inventory_value": "25.99",
          ,
          
            "id": "64320",
            "inventory_value": "15.95",
          ,
          
            "id": "64321",
            "inventory_value": "25.02",
          
        ]
      ,
      
        "id": "116610",
        "key": "5217",
        "subtotal": "59.99",
        "stock_move": [
          
            "id": "64318",
            "inventory_value": "15.56",
          
        ]
      
    ]
  
]

我在 Google Data Studio 项目中使用此表,并尝试显示 order_product.subtotal 字段的总和以及 order_product.stock_move.inventory_value 字段的总和。

似乎为了获取这些数据,Data Studio 交叉连接了所有数据以解压缩嵌套值。这会导致返回错误的总数。

例如,在 Data Studio 中,我有两张记分卡,一张显示order_product.subtotal 的总和,另一张显示order_product.stock_move.inventory_value 的总和。

然后我有一个过滤器,用于过滤order_key = 4416。我想要的结果是小计卡显示总数为247.91,即7.99 + 39.99 + 59.99 + 139.94。 inventory_value 卡片应显示总计102.08,即2.33 + 17.23 + 25.99 + 15.95 + 25.02 + 15.56

实际上,我得到了 inventory_value 卡的正确值,但小计卡的值却是错误的。小计卡上显示的总数为527.79,等于(139.94 * 3) + 7.99 + 39.99 + 59.99

因此,如您所见,139.94 值被包含了三次,因为它具有三个相应的股票走势。这是 Data Studio 正在构建的连接的结果。

如果我查看 Data Studio 正在运行的查询,我可以看到连接导致了问题:

SELECT
  SUM(t0_order_product.subtotal) AS t0_qt_0g2eyjubxb,
  SUM(t0_order_product_stock_move.inventory_value) AS t0_qt_mcntbkubxb
FROM
  `view_orders_products_stock_moves` AS t0
CROSS JOIN
  UNNEST(t0.order_product) AS t0_order_product
CROSS JOIN
  UNNEST(t0_order_product.stock_move) AS t0_order_product_stock_move
WHERE
  t0.ORDER.key IN (4416);

现在,真正困扰我的是,如果我删除 inventory_value 卡,并且只查询小计,就会返回正确的值。换句话说,如果页面上唯一的记分卡是小计,则返回的值是预期的247.91

这是预期的行为吗?根据正在计算的其他指标来获得相同值的不同结果?我明白为什么会这样,但我不确定是否应该这样。

有没有办法解决这个问题?也许是一种强制计分卡用他们自己的查询计算而不是试图将它们组合成一个的方法?由于所需的连接,尝试在一个查询中计算这两个指标似乎会导致错误的答案。或者也许是一种告诉记分卡只对唯一记录求和的方法?

我希望我解释清楚了。谢谢你的帮助。

【问题讨论】:

【参考方案1】:

坏消息,您在 Data Studio 中发现了一个错误,以及它如何处理多个嵌套列。

好消息,我得到了正确的结果,可以在 Data Studio 仪表板上显示:

获得正确结果的秘诀:我创建了两个指向同一张表的不同来源。然后,Data Studio 不会尝试同时查询两列。如果您查看我的报告,您会发现这些记分卡中的每一个都使用不同的数据源。幸运的是,两个数据源都使用了过滤器控件选项。

为什么在为两者使用相同的数据源时,Data Studio 会给出错误的结果?因为 DS 试图优化并仅在一个查询中获取结果,其中交叉连接(错误地)两个嵌套列。您可以通过查看 BigQuery 日志找到查询。

你可以在https://console.cloud.google.com/bigquery?p=fh-bigquery&d=public_dump&t=onerowjson_201905&page=table找到并玩我的共享桌

【讨论】:

感谢您提供非常有帮助的回复。我使用了您的解决方法,现在似乎可以解决问题。我仍然对一件事感到困惑。当我查看 Data Studio 生成的查询时,它们看起来与您的非常不同。我的显示在原始问题中。您可以看到有两个CROSS JOIN 语句。您的查询似乎非常不同,这是为什么呢? 感谢您为我报告此错误。但是,我很困惑接下来应该发生什么。我在 issuetracker 上看不到任何重大活动(除非我遗漏了什么,因为我没有任何使用它的经验)。这不是一个相当大的问题吗?为什么我没有收到任何反馈? 我已在issuetracker.google.com/issues/152805967 此处将其作为错误提出 - 但是,此处的解决方案虽然适用于在同一报告的单独图表中显示数字(因为 DS 将运行单独的查询)。我们不能在不同级别上聚合和除/乘两个数字。 - 如果我们想将来自父母和孩子巢的两个数字聚合起来,然后将它们分开,这是行不通的。例如SUM(transactions.ecommerce_purchases) / COUNT(DISTINCT transactions.items.item_id) 似乎与issuetracker.google.com/issues/132650891有关? @FelipeHoffa 很抱歉打扰您,但也许您可以帮助我解决我最近提出的这个问题。我认为它与这个有一些共同点,因为问题源于在两个表上执行连接:***.com/questions/68934501/…

以上是关于是否可以在数据洞察计算中使用 BigQuery 重复字段?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 Python 创建数据洞察报告吗? [关闭]

从 BigQuery 到数据洞察的日期格式

从 Bigquery 中的原始表主动创建洞察表

BigQuery 分位数到数据洞察

我无法将数据从 BigQuery 迁移到数据洞察

如何将数据洞察控件传递给 BigQuery 自定义查询