如何将STRING类型datestamp_column作为BigQuery分区字段导入CSV
解决BigQuery导入时STRING类型时间字段作为分区字段的问题
BigQuery的时间分区字段要求必须是TIMESTAMP、DATE或DATETIME类型,直接用STRING类型字段会触发报错,给你两种可行的解决思路:
方法一:导入时自动将字符串转为TIMESTAMP类型
你的时间字符串是标准ISO 8601格式(例如2022-11-25T12:56:48.926500Z),BigQuery可以自动识别并完成类型转换。只需修改表schema,把datestamp_column的类型从STRING改为TIMESTAMP即可。
如果是通过schema_from_json加载schema,直接修改schemaa.json中对应字段的类型:
{ "fields": [ { "name": "datestamp_column", "type": "TIMESTAMP", "mode": "NULLABLE" }, // 其他字段配置... ] }
修改后你的原有Python代码即可正常运行,BigQuery在导入CSV时会自动将字符串解析为TIMESTAMP类型,再用该字段做分区。
方法二:使用生成列(Generated Column)实现分区
如果必须保留原字段的STRING类型,可以创建一个基于原字段的TIMESTAMP类型生成列,将其作为分区字段使用。
修改你的加载配置,手动定义包含生成列的schema,并指定分区字段为生成列:
def upload_to_bq(): client = bigquery.Client() # 定义包含原字段和生成列的schema schema = [ bigquery.SchemaField("datestamp_column", "STRING"), # 其他原有字段... bigquery.SchemaField( "partition_timestamp", "TIMESTAMP", generated_type=bigquery.SqlTypeNames.TIMESTAMP, expression="PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E6SZ', datestamp_column)" ) ] job_config = bigquery.LoadJobConfig( schema=schema, skip_leading_rows=1, time_partitioning=bigquery.TimePartitioning( type_=bigquery.TimePartitioningType.DAY, field="partition_timestamp", # 指定生成列为分区字段 expiration_ms=7776000000, # 90天过期 ), ) # 补充加载数据源与目标表的代码 # load_job = client.load_table_from_file(your_file, your_table_ref, job_config=job_config) # load_job.result()
这里的PARSE_TIMESTAMP函数会按照指定格式将字符串转换为TIMESTAMP,生成列会自动计算每行的对应值,无需手动维护,后续可直接用它做分区操作。
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

