pandas - 来自 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 条目?
解决方案
这对于评论来说太长了,但是这里有两个潜在的事情发生(不确定修复是否会有所帮助,但值得尝试)。
Pyarrow 默认假定列是可以为空的。您可以尝试使顶级不可为空(和/或内部字符串元素不可为空),如果它们实际上不能有空值,这应该会改变模式推断。BQ 需要维护中间记录(类似于 parquet)来处理可能也为空的重复元素。
要尝试的第二件事是在编写 pyarrow 表时设置use_compliant_nested_types=True 。这会将内部元素从“item”更改为“element”,这是根据镶木地板规范的正确名称。这也可能会影响事情。(BigQuery 应该支持其中任何一个,所以我认为第一个选项更有可能起作用)。
推荐阅读
- html - 标签标签在 HTML 中的工作原理
- python - 无法访问“DataFrameGroupBy”对象的可调用属性“set_index”,请尝试使用“应用”方法
- c++ - 将指针传递给调用函数,但调用函数参数作为引用
- node.js - EACCES:权限被拒绝,打开'/usr/local/lib/node_modules/npm/bin/npm-cli.js'
- kubernetes - 为什么即使我只有一个 pod,GKE 也不会缩减集群节点?
- html - 如何使用溢出:带有标题标签的隐藏
- python - 从熊猫日期时间变量日和月获取
- rest - 通信两个微服务
- android - 即使在使用 RxJava2 删除应用程序后重复调用方法
- ruby-on-rails - 微软的 Edgium 有硒驱动程序吗?