如何定义在子查询中引用通配符表的 BQ 视图?
Posted
技术标签:
【中文标题】如何定义在子查询中引用通配符表的 BQ 视图?【英文标题】:How to define a BQ view that references wildcard tables within subqueries? 【发布时间】:2018-07-09 14:48:08 【问题描述】:我有一个想要转换为视图的查询。该查询依赖于几个子查询,看起来像这样:
WITH subquery1 AS (
date,
key1,
key2,
other_fields,
....
), subquery2 AS (
date,
key1,
key2,
other_fields,
....
)
SELECT
date,
key1,
key2,
other_fields...
FROM table
JOIN subquery1 USING(key1, key2)
JOIN subquery2 USING(key1, key2)
每个子查询都引用相同的 Google Analytics 会话数据,这些数据分为“数据分区”表,这些表具有相同的表前缀和后缀“yyyymmdd”,在日期字段中引用。
我希望视图能够在所有子查询中选择相关的日期表分区,并且在直接查询表时,如显示的查询中所示。
我没有工作代码 - 我开始认为这是不可能的,可能是因为它涉及相关的子查询。
这不可能吗?或者如果可能的话,什么样的结构/语法可以实现它?
更新
动机是限制查询中选择的数据量。在选择最近的几个日期时,我可以将选择的数据量限制在 500 GB 到数十 GB 之间。
重申一下 - 这些不是正式的日期分区表,它们是一系列具有公共前缀的单个表,所有前缀均以 yyyymmdd 格式结尾。我选择其中的一个范围没有问题,但这对我定义视图没有帮助,我不认为。
更新 2
这是我尝试过的,但使用不同日期进行查询不会影响所选数据量:
WITH revenue AS(
SELECT DISTINCT
key1,
key2,
date,
transactions,
revenue
FROM `project.dataset.revenue` AS main
)
SELECT
_TABLE_SUFFIX AS date,
main.key1 AS m_fvi,
main.key2 AS m_vi,
revenue.transactions,
revenue.revenue
FROM `project.dataset.ga_sessions_*` AS main
LEFT JOIN revenue USING(key1, key2)
WHERE REGEXP_CONTAINS(_TABLE_SUFFIX, r'[0-9]8')
消费查询:
SELECT
*
FROM `project.dataset.view`
WHERE date = '20180701'
选择与以下相同数量的数据:
SELECT
*
FROM `project.dataset.view`
它应该选择大约 1000 分之一的数据,这些数据与 ga_sessions_* 中的“分区”数量一致
【问题讨论】:
我不确定我是否完全理解你的问题。是什么让 dat 表分区与查询相关?建造时间?您是否尝试过以下列方式使用 _PARTITIONTIME?例如... WHERE _PARTITIONTIME BETWEEN TIMESTAMP_TRUNC(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 * 24 HOUR),DAY) AND TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(),DAY);
这是一些关于查询分区表的附加文档cloud.google.com/bigquery/docs/querying-partitioned-tables
感谢您的回复丽莎 - 我在我的问题中添加了一些说明。架构是 GA 导出架构support.google.com/analytics/answer/3437719?hl=en 我不认为这些是正式意义上的分区(我在澄清中解释)。它们是相关的,因为它们将有助于限制我需要选择的数据量。我只是不知道如何通过视图的子查询来处理它。
您只需要在 SELECT 列表中包含 _TABLE_SUFFIX
并给它一个不同的名称。
感谢您的意见@ElliottBrossard - 我不确定我哪里出错了。我在问题的更新中展示了我的“最佳尝试”。它使用 _TABLE_SUFFIX 但仍然从所有底层分区中选择所有数据。
嗨!您是否能够通过 cmets 建议解决问题,或者您仍在尝试修复查询?
【参考方案1】:
用户@ElliottBrossard 在评论中建议使用_TABLE_SUFFIX
。这是您尝试做的正确方法。查询视图和预期的计费结果时会出现混乱。
视图是使用_TABLE_SUFFIX
正确创建的。它从正确的表中获取正确的数据并将它们放在新视图中。现在,运行带有WHERE
子句的查询:
SELECT *
FROM `project.dataset.view`
WHERE date = '20180701'
此查询将读取由匹配正则表达式REGEXP_CONTAINS(_TABLE_SUFFIX, r'[0-9]8')
的所有表组成的整个视图,然后过滤掉与WHERE
子句不匹配的结果。第二个查询在减去过滤后的作用基本相同。这意味着 BigQuery 正在处理的数据量在两个查询中是相同的,因此这两个查询的费用相同。
我理解的解决方案是为每个表创建一个后缀为'yyyymmdd'
的视图。这样,当您查询所需时间戳的视图时,BigQuery 将处理更少的数据。
【讨论】:
我明白了,所以这不是一个好的解决方案,但您已经强调了它发生的原因。包含正则表达式是因为这是来自 Google Analytics 提要的数据。其中两个表将是我不想选择的日内数据。我的具体情况的解决方案是删除正则表达式,然后在查询的后面部分删除不具有“yyyymmdd”形式的表后缀吗? 您可以使用正则表达式(如果您的情况可能)、querying the suffixes you need 或查询中的其他位置将它们过滤掉。如果您用于创建视图的查询有效地过滤了这两个表,那么当您查询视图时,您不会为这两个表的数据付费。该数据不会出现在视图中,因此 BigQuery 不需要对其进行处理。以上是关于如何定义在子查询中引用通配符表的 BQ 视图?的主要内容,如果未能解决你的问题,请参考以下文章