python如何将一个dataframe快速写入clickhouse

目录

前言

dataframe是用python做数据分析最场景的数据结构了,如何将dataframe数据快速写入到clickhouse数据库呢?这里介绍几种方法,各有优劣势,可以结合自己的使用场景挑用。

思路与核心代码

假设df是一个dataframe数据结构,一共有5个列。

  • to_records一条一条插入
python 复制代码
df = pd.Dataframe()

for x in df.to_records(index = False): 
    sql = "INSERT INTO database.table_name(col1,col2,col3,col4,col5)VALUES"+str(tuple(x))
    # print(sql)
    client.execute(sql)

这种方法将dataframe里面每一个看车一个record记录,一条记录一条记录插入clickhouse数据表,不容易出岔子,但是一旦数据量很大,就会要很长时间;

  • 整个dataframe插入
python 复制代码
df = pd.Dataframe()

insert_query = 'INSERT INTO  database.table_name(col1,col2,col3,col4,col5)VALUES'  
values_query = ','.join([tuple(df.iloc[i]) for i in range(len(df))])  
insert_query += f' ({",".join([f"({col}, {val})" for col, val in zip(df.columns, values_query)])})'  
cursor = conn.cursor()  
cursor.execute(insert_query)

这种方法先利用values_query变量将每一行的数据转换为字符串形式,然后,使用INSERT语句将通过将整个DataFrame一次性插入ClickHouse中,避免了频繁的网络通信,从而提高了性能。但是需要注意的是,这种方法只适用于小型数据集。其实,也可以仿MySQL那样用to_sql的方法一次性塞入表里面

python 复制代码
df = pd.Dataframe()

df.to_sql('database.table_name', conn, if_exists='append', index=False) 
  • parallel插入
python 复制代码
insert_query = 'INSERT INTO my_table (name, age, salary) VALUES'  
values_query = ','.join([tuple(df.iloc[i]) for i in range(len(df))])  
insert_query += f' ({",".join([f"({col}, {val})" for col, val in zip(df.columns, values_query)])})'  
cursor = conn.cursor()  
cursor.execute(insert_query, parameters=None, execution_profile='parallel')

对于超大型数据集,建议使用ClickHouse的并行插入功能或其他分布式技术。

优缺点分析

1,如果提前构造好了dataframe,且dataframe数据量适中,那么可以考虑一次性塞入,如果dataframe数据量足够大超出了内存容量,那么就要考虑了;

2,对于哪些容易丢失的还是一条一条插入数据库为好;

相关推荐
standxy6 小时前
即时库存同步实战:从旺店通拉取库存详情落库 MySQL 的完整策略
数据库·集成·电商
麦壳饼6 小时前
SonnetDB:工业 IoT 中的 PID 历史分析与 PLC 协作
数据库·sonnetdb
吹什么轩6 小时前
MySQL 事务管理:从 ACID 到 MVCC,一篇讲透
数据库·mysql
Dumbness6 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
甜到心里的蛋糕6 小时前
从 QQ 机器人到 B 站 AI 运营:一套可复现的视频流水线踩坑实录
运维·人工智能·python·自动化·视频制作
张驰咨询公司6 小时前
六西格玛Python DOE试验矩阵:3因子2水平生成与验算
python·六西格玛·实验设计·itertools·doe试验矩阵
时间售卖铺7 小时前
Oracle DQL精髓:从基础到高级实战
运维·数据库·云原生·oracle
像风一样自由20207 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
m0_639906947 小时前
MySQL 锁机制详解|表锁、行锁、意向锁,死锁成因与解决方案
数据库·mysql
青少儿编程课堂7 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛