首页 > 解决方案 > 来自 pyarrow 上传数据帧的 BigQuery 架构中不必要的 .list.item 嵌套,列表为列。enable_list_inference 部分有效?

问题描述

所以我将此表上传到 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())),

正如这个问题中所建议的,我使用 enable_list_inference。在使用 enable_list_inference 之前,BQ 中的模式如下所示:

没有列表推断的模式

在我使用它之后,我得到:

带有列表推断的模式

那么我丢失列表部分而不是项目部分的原因是什么?我正在传递一个带有某些行中的列表的普通数据框。我怎样才能放弃 .item 部分而只拥有一列 REPEATED 条目?

标签: pandasdataframegoogle-bigqueryparquetpyarrow

解决方案


这对于评论来说太长了,但是这里有两个潜在的事情发生(不确定修复是否会有所帮助,但值得尝试)。

  • Pyarrow 默认假定列是可以为的。您可以尝试使顶级不可为空(和/或内部字符串元素不可为空),如果它们实际上不能有空值,这应该会改变模式推断。BQ 需要维护中间记录(类似于 parquet)来处理可能也为空的重复元素。

  • 要尝试的第二件事是在编写 pyarrow 表时设置use_compliant_nested_types=True 。这会将内部元素从“item”更改为“element”,这是根据镶木地板规范的正确名称。这也可能会影响事情。(BigQuery 应该支持其中任何一个,所以我认为第一个选项更有可能起作用)。


推荐阅读