python clickhouse_driver,clickhouse操作
本文主要介绍Python使用ClickHouse的实践和踩坑的记录,有很好的参考价值,希望对大家有所帮助。如有错误或不足之处,请不吝赐教。
00-1010 1.关于ClickHouse练习1.1。应用于数据仓库场景1.2的ClickHouse。客户端工具DBeaver1.3 .大数据应用实践2。Python使用clickhouse练习2.1。ClickHouse第三方Python驱动clickhouse_driver2.2。实践程序代码3。总结ClickHouse删除指定数据的操作。ClickHouse是近年来备受关注的开源列数据库(DBMS)。主要用于在线数据分析领域(OLAP),2016年开通。目前国内社区火热,大规模使用已有大规模厂商跟进。
今日头条,内部用ClickHouse分析用户行为。内部有上千个ClickHouse节点,单个集群最大节点数1200个,总数据量几十Pb,增加原始数据约300TB。腾讯内部使用ClickHouse分析游戏数据,并为其建立了一套监控运维体系。携程于2018年7月开始内部接入试验。目前,其80%的业务都在ClickHouse上运行。每天,数据增加超过十亿,查询请求近百万。更快的Aauto也在使用ClickHouse,总存储容量约10PB,每天增加200TB,90%的查询小于3S。在国外,Yandex有上百个用于分析用户点击行为的节点,CloudFlare、Spotify等头部公司也在使用。
ClickHouse最初是为全球第二大网络分析平台YandexMetrica开发的。它作为这个系统的核心部件被这个系统持续使用了很多年。
目录
首先,让我们回顾一些基本概念:
OLTP:是一种传统的关系数据库,主要操作增加、删除和搜索,强调事务的一致性,如银行系统、电子商务系统等。OLAP:它是一个仓库数据库,主要读取数据,分析复杂数据,侧重于技术决策支持,提供直观简单的结果。
1. 关于ClickHouse使用实践
ClickHouse是一个列数据库,更适合OLAP场景。OLAP情景的主要特征是:
大部分是大批量(1000行)更新的读请求数据,而不是单行;或者根本没有更新。无法修改添加到数据库中的数据。为了进行读取,从数据库中提取了相当多的行,但是只提取了一小部分列。宽表,即每个表包含大量的列。查询相对较少(通常每台服务器每秒数百个查询或更少)。对于简单的查询,列中的数据可能会延迟大约50毫秒。处理单个查询时,数字和短字符串(例如,每个URL 60字节)需要高吞吐量(每个服务器每秒数十亿行)。交易不是必须的。数据一致性低。每个查询都有一个大表。除了他,其他人都很小。查询结果明显小于源数据。换句话说,数据被过滤或聚集,因此结果适合于单个服务器的RAM。
1.1. ClickHouse 应用于数据仓库场景
Clickhouse客户端工具为dbeaver,官网为https://dbeaver.io/.
Dbeaver是面向开发人员和数据库管理员的免费开源(GPL)通用数据库工具。【百度百科】易用性是这个项目的主要目标,是经过精心设计开发的数据库管理工具。免费,跨平台,基于开源框架,允许各种扩展编写(插件)。它支持任何带有JDBC驱动程序数据库。它可以处理任何外部数据源。通过操作界面菜单中的“数据库”创建和配置新的连接,如下图所示。选择并下载ClickHouse驱动程序(默认不带驱动程序)。
:center">
DBeaver配置是基于Jdbc方式,一般默认URL和端口如下:
jdbc:clickhouse://192.168.17.61:8123
如下图所示。
在是用DBeaver连接Clickhouse做查询时,有时候会出现连接或查询超时的情况,这个时候可以在连接的参数中添加设置socket_timeout参数来解决问题。
jdbc:clickhouse://{host}:{port}[/{database}]?socket_timeout=600000
1.3. 大数据应用实践
环境简要说明:
硬件资源有限,仅有16G内存,交易数据为亿级。
本应用是某交易大数据,主要包括交易主表、相关客户信息、物料信息、历史价格、优惠及积分信息等,其中主交易表为自关联树状表结构。
为了分析客户交易行为,在有限资源的条件下,按日和交易点抽取、汇集交易明细为交易记录,如下图所示。
其中,在ClickHouse上,交易数据结构由60个列(字段)组成,截取部分如下所示:
针对频繁出现would use 10.20 GiB , maximum: 9.31 GiB等内存不足的情况,基于ClickHouse的SQL,编写了提取聚合数据集SQL语句,如下所示。
大约60s返回结果,如下所示:
2. Python使用ClickHouse实践
2.1. ClickHouse第三方Python驱动clickhouse_driver
ClickHouse没有提供官方Python接口驱动,常用第三方驱动接口为clickhouse_driver,可以使用pip方式安装,如下所示:
pip install clickhouse_driver
使用的client api不能用了,报错如下:
File "clickhouse_drivervarint.pyx", line 62, in clickhouse_driver.varint.read_varint
File "clickhouse_driverbufferedreader.pyx", line 55, in clickhouse_driver.bufferedreader.BufferedReader.read_one
File "clickhouse_driverbufferedreader.pyx", line 240, in clickhouse_driver.bufferedreader.BufferedSocketReader.read_into_buffer
EOFError: Unexpected EOF while reading bytes
Python驱动使用ClickHouse端口9000。
ClickHouse服务器和客户端之间的通信有两种协议:http(端口8123)和本机(端口9000)。DBeaver驱动配置使用jdbc驱动方式,端口为8123。
ClickHouse接口返回数据类型为元组,也可以返回Pandas的DataFrame,本文代码使用的为返回DataFrame。
collection = self.client.query_dataframe(self.query_sql)
2.2. 实践程序代码
由于我本机最初资源为8G内存(现扩到16G),以及实际可操作性,分批次取数据保存到多个文件中,每个文件大约为1G。
# -*- coding: utf-8 -*-
返回本地文件为:
3. 小结一下
ClickHouse在OLAP场景下应用,查询速度非常快,需要大内存支持。Python第三方clickhouse-driver 驱动基本满足数据处理需求,如果能返回Pandas DataFrame最好。
ClickHouse和Pandas聚合都是非常快的,ClickHouse聚合函数也较为丰富(例如文中anyLast(x)返回最后遇到的值),如果能通过SQL聚合的,还是在ClickHouse中完成比较理想,把更小的结果集反馈给Python进行机器学习。
操作ClickHouse删除指定数据
def info_del2(i):
在进行数据删除的时候,python操作clickhou和mysql的方式不太一样,这里不能使用以往常用的%s然后添加数据的方式,必须完整的编辑一条语句,如同上面方法所写的一样,传进去的参数统一使用str类型
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。