我的数据不能按日期分区,如何使用集群?
My data can’t be date partitioned, how do I use clustering?
目前我使用以下查询:
SELECT
ID,
钥匙
从
mydataset.mytable
其中 ID = 100077113 和 Key='06019'
我的数据有 1 亿行:
ID - 唯一
密钥 - 可以有大约 10,000 个密钥
如果我知道查找 ID 的键可以在大约 10,000 行上完成并且工作速度更快并且处理的数据更少。
如何使用 BigQuery 中新的集群功能对字段 Key 进行分区?
您可以拥有一个 DATE 类型的字段,其值为 NULL,因此您将能够按该字段进行分区,并且由于 table 分区,您将能够享受集群
您需要重新创建 table 并添加一个所有行都具有 NULL 值的日期列。然后将分区设置为日期列。这样你的 table 就被分区了。
完成此操作后,您将根据在查询中标识的列添加聚类。集群将缩短处理时间并降低查询成本。
(我将对 Mikhail、Pentium10 和 Pavan 所说的进行总结和扩展)
我有一个 table,有 1200 万行和 76 GB 的数据。此 table 没有时间戳列。
这就是 table 聚类的方法 - 在为 fake 分区创建假日期列时:
CREATE TABLE `fh-bigquery.public_dump.github_java_clustered`
(id STRING, size INT64, content STRING, binary BOOL
, copies INT64, sample_repo_name STRING, sample_path STRING
, fake_date DATE)
PARTITION BY fake_date
CLUSTER BY id AS (
SELECT *, DATE('1980-01-01') fake_date
FROM `fh-bigquery.github_extracts.contents_java`
)
成功了吗?
# original table
SELECT *
FROM `fh-bigquery.github_extracts.contents_java`
WHERE id='be26cfc2bd3e21821e4a27ec7796316e8d7fb0f3'
(3.3s elapsed, 72.1 GB processed)
# clustered table
SELECT *
FROM `fh-bigquery.public_dump.github_java_clustered2`
WHERE id='be26cfc2bd3e21821e4a27ec7796316e8d7fb0f3'
(2.4s elapsed, 232 MB processed)
我在这里学到的东西:
- 聚类可以使用唯一 ID,即使 table 没有日期作为分区依据。
- 宁愿使用假日期而不是空日期(但仅限于现在 - 这应该改进)。
- 按 id 查找行时,集群使我的查询成本降低了 99.6%!
阅读更多:https://medium.com/@hoffa/bigquery-optimized-cluster-your-tables-65e2f684594b
现在您可以在 integer column so this might be a good solution, remember there is a limit of 4,000 partitions 上为每个 table 分区 table。因此,因为您有大约 10,000 个键,所以我建议创建一种 group_key 将 id 捆绑在一起,或者您可能有另一列可以用作基数 < 4,000 的整数。
最近 BigQuery 引入了对集群 table 的支持,即使它们没有分区也是如此。所以你可以简单地聚集在你的整数字段上,不要一起使用分区。虽然,此解决方案对于数据扫描优化不是最有效的。
目前我使用以下查询:
SELECT
ID,
钥匙
从
mydataset.mytable
其中 ID = 100077113 和 Key='06019'
我的数据有 1 亿行:
ID - 唯一
密钥 - 可以有大约 10,000 个密钥
如果我知道查找 ID 的键可以在大约 10,000 行上完成并且工作速度更快并且处理的数据更少。
如何使用 BigQuery 中新的集群功能对字段 Key 进行分区?
您可以拥有一个 DATE 类型的字段,其值为 NULL,因此您将能够按该字段进行分区,并且由于 table 分区,您将能够享受集群
您需要重新创建 table 并添加一个所有行都具有 NULL 值的日期列。然后将分区设置为日期列。这样你的 table 就被分区了。
完成此操作后,您将根据在查询中标识的列添加聚类。集群将缩短处理时间并降低查询成本。
(我将对 Mikhail、Pentium10 和 Pavan 所说的进行总结和扩展)
我有一个 table,有 1200 万行和 76 GB 的数据。此 table 没有时间戳列。
这就是 table 聚类的方法 - 在为 fake 分区创建假日期列时:
CREATE TABLE `fh-bigquery.public_dump.github_java_clustered`
(id STRING, size INT64, content STRING, binary BOOL
, copies INT64, sample_repo_name STRING, sample_path STRING
, fake_date DATE)
PARTITION BY fake_date
CLUSTER BY id AS (
SELECT *, DATE('1980-01-01') fake_date
FROM `fh-bigquery.github_extracts.contents_java`
)
成功了吗?
# original table
SELECT *
FROM `fh-bigquery.github_extracts.contents_java`
WHERE id='be26cfc2bd3e21821e4a27ec7796316e8d7fb0f3'
(3.3s elapsed, 72.1 GB processed)
# clustered table
SELECT *
FROM `fh-bigquery.public_dump.github_java_clustered2`
WHERE id='be26cfc2bd3e21821e4a27ec7796316e8d7fb0f3'
(2.4s elapsed, 232 MB processed)
我在这里学到的东西:
- 聚类可以使用唯一 ID,即使 table 没有日期作为分区依据。
- 宁愿使用假日期而不是空日期(但仅限于现在 - 这应该改进)。
- 按 id 查找行时,集群使我的查询成本降低了 99.6%!
阅读更多:https://medium.com/@hoffa/bigquery-optimized-cluster-your-tables-65e2f684594b
现在您可以在 integer column so this might be a good solution, remember there is a limit of 4,000 partitions 上为每个 table 分区 table。因此,因为您有大约 10,000 个键,所以我建议创建一种 group_key 将 id 捆绑在一起,或者您可能有另一列可以用作基数 < 4,000 的整数。
最近 BigQuery 引入了对集群 table 的支持,即使它们没有分区也是如此。所以你可以简单地聚集在你的整数字段上,不要一起使用分区。虽然,此解决方案对于数据扫描优化不是最有效的。