【发布时间】:2019-12-11 05:56:01
【问题描述】:
我正在尝试在两个表之间进行一些模糊匹配。 一个是我在本地存储的表(9,000 行),称为表 A。另一个存储为 sqlite db(200 万 + 行 csv),称为表 B。 基本上,我想将表 A 中的“CompanyNames”列与表 B 中的“CurrentEntityNames”列匹配,并使用它来将表 B 左连接到表 A。
我目前能够遍历 LIKE 语句,传递如下参数: (myNames 只是表 A 中的 CompanyNames 列作为列表)。
for index, name in enumerate(myNames):
sql = 'SELECT * from "table" WHERE CurrentEntityName LIKE ?;'
param =(name + '%%',)
df = pd.read_sql_query(sql,engine, params=param)
myresponses[index] = df
但是,我有两个问题: 1. 我意识到查询表 A 中的每一行可能不是很有效,因为目标是尽量减少与数据库的交互。 如果最好重组以减少查询,我该怎么做? 2. 添加基于 CurrentEntityName 的索引会加快速度吗?
对于方法 2,我尝试使用(在另一个 stackoverflow 答案中找到)添加索引
meta = sqlalchemy.MetaData()
meta.reflect(bind=engine)
table = meta.tables['table']
my_index = sqlalchemy.Index('nameIds', table.columns.get('CurrentEntityName'))
但我不确定在查询时如何实现这一点。
对于方法 1.,我已经看到了一些使用 conn 和 cursor 的示例,但实际上我不确定如何将这些与从引擎创建的数据库结合使用。 (我使用
加载了我的数据for df in pd.read_csv("C://Users//SEAB//Downloads//Active_Corporations___Beginning_1800.csv", chunksize = chunksize, iterator = True):
df = df.rename(columns={c:c.replace(' ', '') for c in df.columns})
df.index +=j
i+=1
df.to_sql('table', engine, if_exists = 'append')
j= df.index[-1] + 1
在本教程中找到 [https://plot.ly/python/v3/big-data-analytics-with-pandas-and-sqlite/]
基本上,查询仍然很慢(9000 行可能需要超过 1 小时)。 我非常感谢任何建议或帮助。我是 sqlite3 的新手,所以我不知道很多。感谢您的理解。
【问题讨论】:
标签: sqlite indexing sqlalchemy sql-like pandasql