在 Bigquery 中使用 Job Config 创建范围分区表

Posted

技术标签:

【中文标题】在 Bigquery 中使用 Job Config 创建范围分区表【英文标题】:Range Partition Table creation using Job Config in Bigquery 【发布时间】:2020-06-05 00:31:57 【问题描述】:

尝试将 csv 文件读入数据帧并使用该数据帧加载到具有范围分区的 Bigquery 表中。但是为 Long: 获得 400 POST Invalid value 不是正确的类型错误。

重现步骤: 使用 google-cloud-bigquery v1.24.0

Test.csv

Name, Age, DOB
"rona", 10, 01-01-2010
"king", 20, 05-01-2000

这是要复制的代码

import pandas as pd
from google.cloud import bigquery

def Range_Partitioning(field, dict_range):
    cRangePartition = bigquery.RangePartitioning(range_=bigquery.PartitionRange(start=dict_range.get("Start"), interval=dict_range.get("Interval"), end=dict_range.get("End")),
                field=field)
    return cRangePartition

df = pd.read_csv("Test.txt", dtype= "Name": "str", "Age": "int64", "DOB": "str", parse_dates=["DOB"])
BQClient = bigquery.Client()
Dataset = "Test"
TableName = "Load_Range_Test"
schema = [
    
        "name": "Name",
        "type": "STRING",
        "mode": "REQUIRED"
    ,
    
        "name": "Age",
        "type": "INTEGER",
        "mode": "REQUIRED"
    ,
    
        "name": "DOB",
        "type": "DATE",
        "mode": "REQUIRED"
    
]
TableRef = sProjectId + "." + Dataset + "." + TableName
RangePartition = Range_Partitioning("Age", "start":0,  "interval":1, "end":100)
WriteOption = "WRITE_TRUNCATE"
JobConfig = bigquery.LoadJobConfig(
                    schema=schema,
                    write_disposition=WriteOption,
                    range_partitioning=RangePartition)
Job = BQClient.load_table_from_dataframe(df, TableRef, job_config=JobConfig)
Job.result()

错误: 400 POST Invalid value for Long: 类型不正确

当我不进行范围分区时工作,只有使用范围分区我会收到此错误。

【问题讨论】:

你确定你可以这样打电话给bigquery.RangePartitioning吗?函数签名说它接受两个参数:(range_: bigquery.PartitionRange, field_: str) @MichaelDelgado 你是对的,我忘了添加我创建的方法,更新了代码。根据 BQ 文档,我确实使用了 range_ 和字段。 你的函数中有什么sPartitionColumn @MichaelDelgado,是字段,它是“年龄”,它是一个整数 @MichaelDelgado 是的,您只需要更改 ProjectId 并拥有适当的凭据即可运行 BQ 作业。它应该运行并给出相同的错误。 【参考方案1】:

我已经完成了代码正常工作,省略了 Range_Partitioning(field, dict_range) 函数用法,明确指定 bigquery.RangePartitioning 参数:

RangePartition = bigquery.RangePartitioning(
field="Age",
range_=bigquery.PartitionRange(start=0, end=100, interval=1)
)
WriteOption = "WRITE_TRUNCATE"
JobConfig = bigquery.LoadJobConfig(
                    schema=schema,
                    write_disposition=WriteOption,
                    range_partitioning=RangePartition)
Job = BQClient.load_table_from_dataframe(df, TableRef, job_config=JobConfig)
Job.result()

似乎是cRangePartition 返回不一致的范围值。

【讨论】:

以上是关于在 Bigquery 中使用 Job Config 创建范围分区表的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 上的提取作业不能确保 Google 存储上的文件

如何在 Bigquery 中插入一个接收 json 字符串值的字段?

Python BigQuery客户端缓存不起作用

谷歌 BigQuery WRITE_TRUNCATE 删除所有数据

bigquery.job.ExtractJobConfig()

如何使用 python 在 BigQuery 中执行 job.insert?我得到“需要登录”,但可以列出所有表和数据集