在 BigQuery python api 中设置聚类列

Posted

技术标签:

【中文标题】在 BigQuery python api 中设置聚类列【英文标题】:Setting clustering column in BigQuery python api 【发布时间】:2019-03-06 20:33:05 【问题描述】:

我正在尝试在 BigQuery 中创建聚簇表。

当我在 UI 中对其进行测试时,它运行良好:

CREATE OR REPLACE TABLE `project_id_xyz.temp.clustering`
PARTITION BY date
CLUSTER BY cluster_col AS
SELECT CURRENT_DATE() as date, 1 as cluster_col

但是,当我在 python (3.7.1) 中通过 google-bigquery==1.9.0 尝试相同操作时,表已创建并已分区但未聚集。如 UI 中的“详细信息”选项卡所示。

这是我用来创建表的 sn-p。

dataset = client.dataset("temp")
table = dataset.table("clustering_test")
job_config = bigquery.QueryJobConfig()
job_config.destination = table
job_config.write_disposition = "WRITE_TRUNCATE"

time_partitioning = TimePartitioning()
time_partitioning.field = "date"
job_config.time_partitioning = time_partitioning
job_config.clustering_fields = ["cluster_col"]

sql = """
    SELECT CURRENT_DATE() as date, 1 as cluster_col
"""
query_job = client.query(
    sql,
    location='US',
    job_config=job_config)

query_job.result() 

代码看起来很简单,也不会抛出任何异常。

有什么明显的我做错了吗?

【问题讨论】:

您确定不需要在您的 sql 字符串中包含整个查询(正如您在 UI 中所写的)?通常,在 Java 中,我必须指定所有执行的操作以及项目/数据集/表。 为什么不使用客户端 API 运行相同的查询? 通过 job_config 以编程方式更改作业配置比尝试直接解析和更改 SQL 代码更容易。这就是为什么我猜他们的 api 提供了两种方法。 【参考方案1】:

我运行了你的 python 代码,我可以确认它在集群设置中按预期工作。

使用 Python 3.6.7 解决您的问题的方法是创建一个干净的版本并再次运行您的代码

【讨论】:

包里恐怕没有Clustering()这样的对象。另外,如果我理解正确,则根据文档,集群字段直接定义为 job_config.clustering_fields 下的列表。 googleapis.github.io/google-cloud-python/latest/bigquery/… 塔米尔,感谢您的检查!这很有帮助。至少我知道代码是正确的,但我的设置有问题。出于兴趣,您使用的是什么 python 版本? 谢谢,我现在已经创建了一个干净的 python 安装和 virtualenv,它现在也可以工作了。非常感谢您确认代码对您有用,它有助于调试到正确的方向。 @Dimitri 对答案进行投票也很重要。投票选出有帮助的答案......当有人回答您的问题时,您可以查看该怎么做 - ***.com/help/someone-answers

以上是关于在 BigQuery python api 中设置聚类列的主要内容,如果未能解决你的问题,请参考以下文章

您可以 SQL 填充 BigQuery 表并在同一个 API 调用中设置表列模式吗?

无法在 BigQuery 中使用 DML 语句的作业中设置目标表

在 Google Cloud Storage 中设置元数据(从 BigQuery 导出)

BigQuery 没有获取在 java 中设置的属性

如何在 BigQuery 中设置动态会计日期范围?

如何在 Google BigQuery 中设置用户的查询配额