在 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 字符串值的字段?
谷歌 BigQuery WRITE_TRUNCATE 删除所有数据
bigquery.job.ExtractJobConfig()
如何使用 python 在 BigQuery 中执行 job.insert?我得到“需要登录”,但可以列出所有表和数据集