Google bigquery 我的数据不能进行日期分区,如何使用群集?

Google bigquery 我的数据不能进行日期分区,如何使用群集?,google-bigquery,partition,clustered-index,Google Bigquery,Partition,Clustered Index,目前我正在使用以下查询: 选择 身份证件 钥匙 从…起 mydataset.mytable 其中ID=100077113
和Key='06019' 我的数据有1亿行: ID-唯一 钥匙-可以有约10000把钥匙 如果我知道查找ID的键可以在大约10000行上完成,并且工作速度更快,处理的数据更少 如何使用BigQuery中的新群集功能对字段键进行分区?您可以有一个日期类型为空值的字段,这样您就可以按该字段进行分区,并且由于表已分区,您将能够享受群集功能您可以有一个日期类型为空值的字段,因此,您将

目前我正在使用以下查询: 选择 身份证件 钥匙 从…起 mydataset.mytable 其中ID=100077113
和Key='06019'

我的数据有1亿行: ID-唯一

钥匙-可以有约10000把钥匙 如果我知道查找ID的键可以在大约10000行上完成,并且工作速度更快,处理的数据更少


如何使用BigQuery中的新群集功能对字段键进行分区?

您可以有一个日期类型为空值的字段,这样您就可以按该字段进行分区,并且由于表已分区,您将能够享受群集功能

您可以有一个日期类型为空值的字段,因此,您将能够按该字段进行分区,并且由于表已分区,因此您将能够享受群集功能

,您需要使用一个附加的日期列重新创建表,其中所有行都具有空值。然后将partition设置为date列。这样你的桌子就被分割了


完成此操作后,将根据查询中标识的列添加集群。群集将缩短处理时间并降低查询成本。

您需要使用一个附加的日期列重新创建表,其中所有行都具有空值。然后将partition设置为date列。这样你的桌子就被分割了


完成此操作后,将根据查询中标识的列添加集群。集群将缩短处理时间,降低查询成本。

我将总结并扩展Mikhail、Pentium10和Pavan所说的内容

我有一个包含1200万行和76 GB数据的表。此表没有时间戳列

这就是如何对所述表进行集群,同时为假分区创建假日期列:

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,即使对于没有分区日期的表也是如此。 更喜欢使用假日期而不是空日期,但只是现在-这应该得到改进。 当按id查找行时,集群使我的查询便宜了99.6%!
阅读更多内容:

我将总结并扩展米哈伊尔、奔腾10和帕万所说的内容

我有一个包含1200万行和76 GB数据的表。此表没有时间戳列

这就是如何对所述表进行集群,同时为假分区创建假日期列:

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,即使对于没有分区日期的表也是如此。 更喜欢使用假日期而不是空日期,但只是现在-这应该得到改进。 当按id查找行时,集群使我的查询便宜了99.6%!
阅读更多信息:

现在您可以在上对表进行分区,因此这可能是一个很好的解决方案,请记住每个表的分区限制为。因为您有10000个键,所以我建议您创建一种组_键,将ID捆绑在一起,或者您可以使用另一列作为基数<4000的整数


最近BigQuery引入了对集群表的支持,即使它们没有分区。因此,您可以简单地在整数字段上进行集群,而不必同时使用分区。虽然,此解决方案对于数据扫描优化不是最有效的。

现在您可以在上对表进行分区,因此这可能是一个好的解决方案,请记住每个表都有一个限制。因为您有10000个键,所以我建议您创建一种组_键,将ID捆绑在一起,或者您可以使用另一列作为基数<4000的整数


最近BigQuery引入了对集群表的支持,即使它们没有分区。因此,您可以简单地在整数字段上进行集群,而不必同时使用分区。虽然,此解决方案对于数据扫描优化不是最有效的。

问题是如何不在日期字段上执行此操作。现在-只能在日期类型上执行分区,只能在已分区的表上执行群集-期间-因此,我以为您正在寻找解决方法!根据文档-google正在为非分区表支持集群,尽管Felipe Hoffa我的数据不能进行日期分区,但我如何使用集群?2个备选方案:1。在感兴趣的字段上使用带集群的摄取时间分区表。如果您每天有>10GB的数据,这是首选机制。2.如果每天的数据量较小,请使用带有集群的列分区表,该表分区在“假”日期可选列上。只需对其使用NULL值,或者不指定它,BigQuery将假定它为NULL。指定感兴趣的clust CLMN。问题是如何不在日期字段上执行。现在-只能在日期类型上执行分区,只能对已分区的表执行群集-期间-因此,我以为您正在寻找解决方法!根据文档-谷歌正在进行
支持非分区表的集群虽然Felipe Hoffa我的数据不能进行日期分区,但如何使用集群?2个备选方案:1。在感兴趣的字段上使用带集群的摄取时间分区表。如果您每天有>10GB的数据,这是首选机制。2.如果每天的数据量较小,请使用带有集群的列分区表,该表分区在“假”日期可选列上。只需对其使用NULL值,或者不指定它,BigQuery将假定它为NULL。指定感兴趣的clust clmns。例如,假设您的表包含整数、b字符串和c字符串字段,并且您希望按b进行聚类。bq查询-nouse_legacy_sql'创建表mydataset.mytabled DATE,a INT64,b STRING,c STRING分区按d集群按b作为选择NULL作为d,1作为a,2作为b,3作为c'分区按d-DATE。我没有日期,我有整数。请你读我答案中的第一行。您需要添加一个日期列,即使您不使用它。bq查询-nouse_legacy_sql'创建表mydataset.mytabled DATE,a INT64,b STRING,c STRING分区按d集群按b作为选择NULL作为d,1作为a,2作为b,3作为c'分区按d-DATE。我没有日期,我有整数。请你读我答案中的第一行。你需要添加一个日期列,即使你不使用它。我按照你的建议做了。用我在where子句中使用的四个集群列创建了我的表。结果非常令人印象深刻:表大小:13.28GB。行数:12693413。未聚集:限制10000个查询完成2.1秒,处理1.05 GB。群集:限制10000个查询完成2.8秒,处理91.2 MB。但没有限制-完整表:未聚集:查询完成77.5s,处理1.05GB。集群式:查询完成时间为65.6秒,处理912 MB~100 MB。限制与实际中不会使用的限制存在巨大差异。我尝试使用限制12693413,但没有差异。现在我有另一个问题。尝试与另一个表联接,但出现错误:查询超出了资源限制。使用了301984.67488667317 CPU秒,此查询使用的CPU秒数必须少于147900.0。这是使用集群表进行测试的一个原因——如果它也能更快地完成的话。如果在满表上运行,使用的内存越少越好,但资源限制现在是一个问题。如果不发布数据,或者至少不发布所使用的集群策略,则很难在此处进行调试。这里已经回答了如何在没有日期的情况下进行集群的问题。请发布新的问题和其他背景。菲利佩-谢谢你的帮助!我不能发布,因为它来自alpha测试,可能是其他方式?我的测试还强调使用假日期而不是空日期的重要性。在我的第一次测试中,我使用了NULL,结果非常糟糕。当使用假日期时,创建表需要将近1小时,而不是5分钟,然后查询几乎没有减少成本。我按照您的建议做了。用我在where子句中使用的四个集群列创建了我的表。结果非常令人印象深刻:表大小:13.28GB。行数:12693413。未聚集:限制10000个查询完成2.1秒,处理1.05 GB。群集:限制10000个查询完成2.8秒,处理91.2 MB。但没有限制-完整表:未聚集:查询完成77.5s,处理1.05GB。集群式:查询完成时间为65.6秒,处理912 MB~100 MB。限制与实际中不会使用的限制存在巨大差异。我尝试使用限制12693413,但没有差异。现在我有另一个问题。尝试与另一个表联接,但出现错误:查询超出了资源限制。使用了301984.67488667317 CPU秒,此查询使用的CPU秒数必须少于147900.0。这是使用集群表进行测试的一个原因——如果它也能更快地完成的话。如果在满表上运行,使用的内存越少越好,但资源限制现在是一个问题。如果不发布数据,或者至少不发布所使用的集群策略,则很难在此处进行调试。这里已经回答了如何在没有日期的情况下进行集群的问题。请发布新的问题和其他背景。菲利佩-谢谢你的帮助!我不能发布,因为它来自alpha测试,可能是其他方式?我的测试还强调使用假日期而不是空日期的重要性。在我的第一次测试中,我使用了NULL,结果非常糟糕。当使用假日期时,创建表需要将近1小时,而不是5分钟,然后查询几乎没有降低成本