加入所有PostgreSQL表并制作Python字典

时间:2016-09-14 20:16:56

标签: 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,每个用户一个文档。

2 个答案:

答案 0 :(得分:2)

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

以下是一些可以帮助您避免内存错误的建议:

  • 您可以使用 WITH 子句,以便更好地利用您的记忆。
  • 您可以创建一些物理表来存储信息 数据库的不同表组。这些物理表将避免使用大量内存。之后,您所要做的就是只加入那些物理表。你可以为它创建一个函数。
  • 您可以通过对所需表格进行非规范化来创建数据仓库。
  • 最后但并非最不重要:确保您正确使用索引

答案 1 :(得分:0)

我不确定这会有所帮助,但您可以尝试pd.concat

raw_dict = pd.concat([d.set_index('USER_ID') for d in df_arr], axis=1)

或者,为了获得更多的分析

raw_dict = pd.concat([d.set_index('USER_ID') for d in df_arr], axis=1, keys=sql_tables)

如果这没用,请告诉我,我会将其删除。