所以我将这个表上传到 BigQuery 中
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.PARQUET
job_config.write_disposition = "WRITE_TRUNCATE"
pq_opt = ParquetOptions()
pq_opt.enable_list_inference = True
job_config.parquet_options = pq_opt
job = self.client.load_table_from_file(source_file, table_ref, job_config=job_config)
比如说,我有一个 pa.schema,其中包含以下类型的条目:
("image_id", pa.list_(pa.string())),
并按照 this question 中的建议我使用 enable_list_inference。在使用 enable_list_inference 之前,BQ 中的架构如下所示:
Schema without list inference
在我使用它之后我得到:
Schema with list inference
那么我丢失列表部分而不是项目部分的原因是什么?我正在传递一个在某些行中包含列表的普通数据框。我怎样才能放弃 .item 部分,而只有一列重复的条目?
最佳答案
评论变得太长了,但这里可能会发生两件事(不确定修复其中任何一个是否有帮助,但值得尝试)。
Pyarrow 默认假定列为 nullable .您可以尝试使顶级不可为空(和/或内部字符串元素不可为空),如果它们实际上不能有空值,这应该改变模式推断。 BQ 需要维护中间记录(类似于 parquet)来处理可能也为 null 的重复元素。
要尝试的第二件事是设置 use_compliant_nested_types=True在编写 pyarrow 表时。这会将内部元素从“item”更改为“element”,这是根据 parquet specification 的正确名称.这也可能会影响事情。 (BigQuery 应该支持其中任何一个,所以我认为第一个选项更有可能起作用)。
关于pandas - 不必要的 .list.item 嵌套在 pyarrow 上传数据框中的 BigQuery 模式中,列表作为列。 enable_list_inference 部分有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68303327/