python - 一种将非常大的 csv 数据写入 SQL 数据库的方法

标签 python sql postgresql csv

我有多个包含以下内容的 csv 文件:

Duration (ms),Start date,End date,Start station number,Start station,End station number,End station,Bike number,Member Type
840866,8/31/2016 23:59,9/1/2016 0:13,31117,15th & Euclid St  NW,31228,8th & H St NW,W20409,Registered

我有大约 1000 万个原始数据。

我需要规范化这些数据并将其拆分成表格。我想会有 table :车站、自行车、游乐设施。就 OLAP 而言,骑行是事实,车站和自行车是维度。我对数据分析很陌生,所以我可能会使用不正确的术语。但我正在尝试使用 this方法。

那么问题是如何尽可能优化地将这些数据写入数据库?我可以想象的方法如下:

1) Read line from csv
2) Create a record for station and get foreign key for it (with direct SQL query).
3) Create a record for a bike and get FK for it.
4) Create a record for a datetime (i'm not sure if it could be useful for further data analysis)
5) Create a record for ride with FK for each of it 'dimensions'
6) Repeat

但如果我有 1000 万行,这种方法将对数据库进行约 4000 万次查询,这看起来很糟糕而且不是最优的。

是否有更优化的方法/算法/技术来做到这一点?如果它很重要,我将为此使用 python 和 psql。

最佳答案

您可以通过 memoizing the function 节省查询费用创建唯一记录,例如:

from functools import lru_cache

@lru_cache(maxsize=128)
def save_station(s):
    """Create station record and return primary key."""
    station = create_or_get_station_record(...)
    return station.id

如果输入按站排序,则在创建记录后对 save_station 的后续调用将不会查询数据库。即使它没有完全排序,这也可能有所帮助。

您可以批量保存游乐设施。累积记录,然后调用 execute_many 函数(取决于您使用的库)。

您可以预处理数据以创建单独的 CSV 文件,然后加载每个文件。

关于python - 一种将非常大的 csv 数据写入 SQL 数据库的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40307215/

相关文章:

python - 具有部分洗牌功能的 Tensorflow 数据集

python - 错误 : "Resample() got an unexpected keyword argument ' how'"

python - 基于多列过滤文本文件

mysql - Hibernate 查询比较日期(最多过去 10 个月)

sql - 启用其中已包含数据的标识列?

javascript - pg-promise 任务和事务的链接查询

sql - 检索客户的最后一个挂单

sql - 如果找不到值,如何从函数返回值

使用 BeautifulSoup4 的 Python Web 抓取跨度标签以获取英镑价格

mysql - 如何选择不同的行,其中 2 列应该在多行上匹配?