如何提高使用分区+集群 table 查询的数据量?
How can I improve the amount of data queried with a partitioned+clustered table?
我有一个 BigQuery table - 天分区和集群。但是,当我 运行 查询它时,它仍然使用大量数据。这怎么可能?
有时没有分区,或者 weekly/monthly/yearly 分区会比每天分区 table + 集群更好。
这是因为 BigQuery 中的每个数据集群都有最小大小。如果每日分区 table 中的每一天数据都少于该数据量,那么对 table.
进行集群根本看不到任何好处
例如,让我们创建一个具有 30 多年天气的 table。我将按月对 table 进行分区(将多年合并为一个 table):
CREATE TABLE `temp.gsod_partitioned`
PARTITION BY date_month
CLUSTER BY name
AS
SELECT *, DATE_TRUNC(date, MONTH) date_month
FROM `fh-bigquery.weather_gsod.all`
现在,我们 运行 对其进行查询 - 使用聚类字段 name
:
SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `temp.gsod_partitioned`
WHERE name LIKE 'SAN FRANC%'
AND date > '1980-01-01'
GROUP BY 1,2
ORDER BY active_until DESC
# (2.3 sec elapsed, 3.1 GB processed)
现在,让我们在相同的 table 上执行此操作 - 按假日期分区(因此实际上没有分区),并按同一列聚集:
SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `fh-bigquery.weather_gsod.all`
WHERE name LIKE 'SAN FRANC%'
AND date > '1980-01-01'
GROUP BY 1,2
ORDER BY active_until DESC
# (1.5 sec elapsed, 62.8 MB processed)
只处理了 62.8 MB 的数据(对比 3.1GB)!
这是因为没有分区的集群在每天没有很多 GB 的 table 上更有效。
奖励:按地理位置聚类:
SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `fh-bigquery.weather_gsod.all_geoclustered`
WHERE date > '1980-01-01'
AND ST_DISTANCE(point_gis, ST_GEOGPOINT(-122.465, 37.807)) < 40000
GROUP BY 1,2
ORDER BY ST_DISTANCE(ANY_VALUE(point_gis), ST_GEOGPOINT(-122.465, 37.807))
# (2.1 sec elapsed, 100.7 MB processed)
我有一个 BigQuery table - 天分区和集群。但是,当我 运行 查询它时,它仍然使用大量数据。这怎么可能?
有时没有分区,或者 weekly/monthly/yearly 分区会比每天分区 table + 集群更好。
这是因为 BigQuery 中的每个数据集群都有最小大小。如果每日分区 table 中的每一天数据都少于该数据量,那么对 table.
进行集群根本看不到任何好处例如,让我们创建一个具有 30 多年天气的 table。我将按月对 table 进行分区(将多年合并为一个 table):
CREATE TABLE `temp.gsod_partitioned`
PARTITION BY date_month
CLUSTER BY name
AS
SELECT *, DATE_TRUNC(date, MONTH) date_month
FROM `fh-bigquery.weather_gsod.all`
现在,我们 运行 对其进行查询 - 使用聚类字段 name
:
SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `temp.gsod_partitioned`
WHERE name LIKE 'SAN FRANC%'
AND date > '1980-01-01'
GROUP BY 1,2
ORDER BY active_until DESC
# (2.3 sec elapsed, 3.1 GB processed)
现在,让我们在相同的 table 上执行此操作 - 按假日期分区(因此实际上没有分区),并按同一列聚集:
SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `fh-bigquery.weather_gsod.all`
WHERE name LIKE 'SAN FRANC%'
AND date > '1980-01-01'
GROUP BY 1,2
ORDER BY active_until DESC
# (1.5 sec elapsed, 62.8 MB processed)
只处理了 62.8 MB 的数据(对比 3.1GB)!
这是因为没有分区的集群在每天没有很多 GB 的 table 上更有效。
奖励:按地理位置聚类:
SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `fh-bigquery.weather_gsod.all_geoclustered`
WHERE date > '1980-01-01'
AND ST_DISTANCE(point_gis, ST_GEOGPOINT(-122.465, 37.807)) < 40000
GROUP BY 1,2
ORDER BY ST_DISTANCE(ANY_VALUE(point_gis), ST_GEOGPOINT(-122.465, 37.807))
# (2.1 sec elapsed, 100.7 MB processed)