使用BigQuery

时间:2015-08-18 19:25:25

标签: google-bigquery

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

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指定的区域。我想根据datasetA中是否存在包含datasetA.location的区域来过滤datasetB。如果不存在这样的区域,我想过滤掉那一行。

同样的好处是创建一个中间表,其中包含datasetA中包含每个位置的区域数量,然后对其进行过滤,但我还没有设法解决这个问题。

这些表是否必须包含在同一数据集中才能实现?

感谢您的帮助。

1 个答案:

答案 0 :(得分: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的大小,假设您可以保证区域的最大大小很小。