当前位置: 首页 > news >正文

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

目录

  • 前言
  • 思路与核心代码
  • 优缺点分析

前言

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

思路与核心代码

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

  • to_records一条一条插入
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插入
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的方法一次性塞入表里面

df = pd.Dataframe()df.to_sql('database.table_name', conn, if_exists='append', index=False) 
  • parallel插入
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,对于哪些容易丢失的还是一条一条插入数据库为好;

http://www.lryc.cn/news/159928.html

相关文章:

  • Tiny Player Mac:小而美,音乐播放的极致体验
  • 2022年12月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • C语言学习:7、break与continue的用法
  • Ubuntu中安装clion并把clion添加到桌面快捷方式
  • 如何利用python来提取SQL语句中的表名称
  • linux通用时钟框架(CCF)
  • 基于AERMOD模型在大气环境影响评价中的实践技术应用
  • 企业内训课程、在线教育平台付费课程加密防下载的10种方式
  • 公关世界杂志公关世界杂志社公关世界编辑部2023年第14期目录
  • Linux常用(实用)命令大全
  • 2023-09-07力扣每日一题
  • 从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
  • 适用于Linux的Windows子系统(系统安装步骤)
  • HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别
  • 如何使用GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图
  • Blender中的高级边缘控制和纹理映射
  • 从0开始学go第四天
  • 【飞书ChatGPT机器人】飞书接入ChatGPT,打造智能问答助手
  • vue3集成jsoneditor
  • 自然语言处理 中文停用词词典
  • CocosCreator3.8研究笔记(十)CocosCreator 图像资源的理解
  • 计算机使用中常用截图与标注方法
  • Elasticsearch,Logstash和Kibana安装部署(ELK Stack)
  • MATLAB中movmean函数用法
  • IIS短文件名泄露漏洞复现
  • 万字解读 Android 车机核心 :CarService 的构成和链路~
  • C#使用Panel
  • Jabbi的Rust学习日记(一)
  • 电脑磁盘分区形式是什么?如何更改?
  • Outlook无需API开发连接钉钉群机器人,实现新增会议日程自动发送群消息通知