繁体   English   中英

如何使用pandas数据帧有效地更新mysql表?

[英]how to update a mysql table efficiently with a pandas dataframe?

我正在使用Airflow PythonOperator进行ETL更新SCD1维度表( dim_user )。

mysql维度表的结构:

| user_key | open_id             | gender | nickname | mobile      | load_time           | updated_at          |
|----------|---------------------|--------|----------|-------------|---------------------|---------------------|
| 117      | ohwv90JTgZSn******* | 2      | ABC      | ************| 2019-05-24 10:12:44 | 2019-05-23 19:00:43 |

在python脚本中,我有一个相同的结构(user_key和load_time列除外)pandas df_users_updated

现在我想在匹配的open_id字段的条件下更新mysql表:

# database connection
conn = create_engine(db_conn_str)

# update the rows with a for loop
for index, row in df_users_updated.iterrows():
    info = dict(row)
    conn.execute('update dim_user set gender=%s, nickname=%s, mobile=%s, updated_at=%s where open_id=%s',
    (info['gender'], info['nickname'], info['mobile'], info['updated_at'], info['open_id']))
conn.dispose()

问题是我在df_users_updated中只有1000行,它需要超过10分钟才能执行这些更新查询。

有一个更好的方法吗?

根据我的经验,有一些技巧可以提高性能。

  1. 使用mysqlclient lib, cursor.executemany(sql, params)方法
  2. 使用tuple类型的参数
  3. 在where字段上使用index。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM