【问题标题】:Integrating multiple datasets for the purpose of filtering (without joins) using BigQuery使用 BigQuery 集成多个数据集以进行过滤(无连接)
【发布时间】:2015-08-19 14:01:16
【问题描述】:

我正在尝试根据另一个数据集中的条件过滤数据集。在代码中是这样的(虽然这不起作用):

SELECT
  location_integer
FROM
  [datasetA]
WHERE
  (SELECT COUNT(*) FROM datasetB
  WHERE
    datasetB.region_start < datasetA.location_integer
    AND datasetA.location_integer < datasetB.region_end) > 1

用文字表示:datasetA 有一列位置(整数),datasetB 有一列由 region_startregion_end 指定的区域。我想通过datasetB 中是否存在包含datasetA.location 的区域来过滤datasetA。如果不存在这样的区域,我想过滤掉该行。

创建一个包含datasetA 中每个位置的区域数量的中间表同样好,然后对其进行过滤,但我也没有设法弄清楚。

这些表是否必须包含在同一个数据集中才能正常工作?

感谢您的帮助。

【问题讨论】:

  • 那里在做什么?那应该是一个简单的“WHERE”。
  • @Pentium10 是的,您完全正确,刚刚更新了问题。我想我已经把它缩小到 BigQuery SQL 不理解 WHERE (...) &gt; 1,特别是 &gt; 1 位的事实。这是我试图弄清楚如何表达EXISTS,因为它存在于某些关系数据库中。

标签: google-bigquery


【解决方案1】:

几乎所有在 BigQuery 中组合来自两个表的数据的答案都可以归结为联合或联接。联合显然对您的用例没有帮助,因此您正在考虑加入。

不幸的是,这是一个非常棘手的问题,因为 BigQuery 的连接条件只允许等式的连接(例如,a.f = b.f AND a.g = b.g)。

如果您的表不是太大,您可以 CROSS JOIN 它们,并过滤掉剩余的行。但随着表变大,该解决方案无法很好地扩展,因为生成的中间数据量可能非常巨大。

或者,如果您的区域包含少量离散值,您可以将 datasetB 与整数表连接,以生成每个区域中包含的点列表,然后将该表与位置表连接。

SELECT location_integer
FROM datasetA
WHERE location_integer IN
  (SELECT (datasetB.region_start + integers.n) AS region_point
   FROM datasetB
   CROSS JOIN integers
   WHERE integers.n <= (datasetB.region_end - datasetA.region_start))

假设您可以保证区域的最大大小很小,这种方法会减少 CROSS JOIN 的大小。

【讨论】:

  • 有趣的解决方案。绝大多数区域的大小 1000 的区域的长尾,最多 26,348 个。有 3,969,906 个这样的区域。听起来 SQL 不适合表达这一点。我可能会尝试使用编程语言来执行此计算的“批处理”版本,同时进行查询。换句话说,for 循环遍历区域并选择datasetA 中适合给定区域的所有行。
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多