【发布时间】:2021-11-06 14:28:35
【问题描述】:
我有一个 非常大 包含数百万行的 Postgres 表。其中一列称为data,类型为JSONB,带有嵌套的JSON(但幸运的是没有子数组)。 JSON 的“模式”大部分是一致的,但随着时间的推移发生了一些变化,获得和丢失新的键和嵌套的键。
我想要一个可以将列规范化为新表的过程,并且过程尽可能简单。
例如,如果表格看起来像:
id | data
---+----------------------------------------------
1| {"hi": "mom", "age": 43}
2| {"bye": "dad", "age": 41}
它应该创建并填充一个新表,例如
id | data.hi | data.age | data.bye
---+----------------------------------------------
1| mom | 43 | NULL
2| NULL | 41 | dad
(注意:列名并不重要)
理论上,我可以做到以下几点:
- 将列选择到 Pandas DataFrame 中并在其上运行 json_normalize
- 将架构推断为步骤 1 中派生列的超集
- 使用步骤 2 的架构创建 Postgres 表并插入(to_sql 是实现此目的的简单方法)
这似乎并不算太糟糕,但请记住,表非常大,我们应该假设这不能从单个 DataFrame 中完成。如果我们尝试做下一个最好的事情 - 将上述步骤批处理 - 我们将遇到架构在批处理之间略有变化的问题。
有没有比我的方法更好的方法来解决这个问题? “完美”的解决方案是“纯 SQL”,根本不涉及任何 Python。但我不是在这里寻求完美。只是一个不需要人工干预的自动且稳健的过程。
【问题讨论】:
-
阅读this post.中的通用解决方案@
-
这太棒了!
标签: python sql pandas postgresql jsonb