python - 加入所有 PostgreSQL 表并制作一个 Python 字典

标签 python database postgresql pandas elasticsearch

我需要连接所有 PostgreSQL 表并在Python 字典中转换它们。数据库中有 72 个表。总列数大于 1600

我编写了一个简单的 Python 脚本来连接多个表,但由于 the memory error 而无法连接所有表.脚本执行期间所有内存都被占用。我在具有 128GB RAM 和 8 个 CPU 的新虚拟服务器上运行脚本。它在 lambda 函数执行期间失败。

如何改进以下代码以执行所有 表连接?

from sqlalchemy import create_engine
import pandas as pd

auth = 'user:pass'
engine = create_engine('postgresql://' + auth + '@host.com:5432/db')

sql_tables = ['table0', 'table1', 'table3', ..., 'table72']        
df_arr = []
[df_arr.append(pd.read_sql_query('select * from "' + table + '"', con=engine)) for table in sql_tables]

df_join = reduce(lambda left, right: pd.merge(left, right, how='outer', on=['USER_ID']), df_arr)
raw_dict = pd.DataFrame.to_dict(df_join.where((pd.notnull(df_join)), 'no_data'))

print(df_join)
print(raw_dict)
print(len(df_arr))

可以用Pandas吗为了我的目的?有更好的解决方案吗?

最终目标是denormalize数据库数据能够将其索引到 Elasticsearch作为文档,每个用户一个文档。

最佳答案

为什么不创建一个 postgres 函数而不是脚本?

这里有一些建议可以帮助您避免内存错误:

  • 您可以使用 WITH 子句来更好地利用您的内存。
  • 您可以创建一些物理表来存储以下信息 数据库的不同表组。这些物理表将避免使用大量内存。之后,您所要做的就是仅连接那些物理表。您可以为其创建一个函数。
  • 您可以通过非规范化所需的表来创建数据仓库。
  • 最后但同样重要的是:确保您正确使用索引

关于python - 加入所有 PostgreSQL 表并制作一个 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498948/

相关文章:

mysql - 多对多关系默认为 "all"

postgresql - 在 Postgres 中选择一行作为 JSON

python - 确认 postgres 'update' 查询在 python 中有效

python - 使用 Pytorch 在同一 GPU 上的进程之间共享 GPU 内存

python - 如何从python列表中提取索引倍数为2的元素

python - pandas df.ix[number, column] 访问与 df[column].ix[number] 不同的标量类型

python - 计算求解 100 个变量的非线性方程组

mysql - SQL:如何用一个id引用多个数据集?

Postgresql 查询没有终止,重启后服务 postgresql 没有启动

mysql - 错误 : Packets out of order. 得到:0 预期:3